(इस उत्तर @UncleBens के रूप में ही थोड़ा अधिक सामान्य यह सही-आगे कोई भी तर्क रूप में है, लेकिन।)
यह haskell जैसी भाषाओं में जहां बहुत उपयोगी है, उदाहरण के लिए, read
ले जाएगा एक स्ट्रिंग इनपुट के रूप में और इच्छित वांछित प्रकार के अनुसार इसे पार्स करेगा।
(यहाँ sample code on ideone है।)
सबसे पहले, समारोह foo
जिसका वापसी प्रकार हम अनुमान करना चाहते हैं के साथ शुरू:
template<typename Ret>
Ret foo(const char *,int);
template<>
std::string foo<std::string>(const char *s,int) { return s; }
template<>
int foo<int >(const char *,int i) { return i; }
जब एक स्ट्रिंग के लिए कहा है, यह स्ट्रिंग में है कि वापस आ जाएंगे, इसका पहला तर्क जब एक int के लिए पूछा जाता है, तो यह दूसरा तर्क वापस कर देगा।
हम एक समारोह auto_foo
कि के रूप में इस्तेमाल किया जा सकता परिभाषित कर सकते हैं इस प्रकार है:
int main() {
std::string s = auto_foo("hi",5); std::cout << s << std::endl;
int i = auto_foo("hi",5); std::cout << i << std::endl;
}
इस काम बनाने के लिए हम एक वस्तु को अस्थायी रूप से समारोह तर्क स्टोर करेगा, और यह भी समारोह जब चलाने की जरूरत है यह वांछित वापसी प्रकार के convert करने के लिए कहा जाता है:
#include<tuple>
template<size_t num_args, typename ...T>
class Foo;
template<typename ...T>
class Foo<2,T...> : public std::tuple<T&&...>
{
public:
Foo(T&&... args) :
std::tuple<T&&...>(std::forward<T>(args)...)
{}
template< typename Return >
operator Return() { return foo<Return>(std::get<0>(*this), std::get<1>(*this)); }
};
template<typename ...T>
class Foo<3,T...> : std::tuple<T&&...>
{
public:
Foo(T&&... args) :
std::tuple<T&&...>(std::forward<T>(args)...)
{}
template< typename Return >
operator Return() { return foo<Return>(std::get<0>(*this), std::get<1>(*this), std::get<2>(*this)); }
};
template<typename ...T>
auto
auto_foo(T&&... args)
// -> Foo<T&&...> // old, incorrect, code
-> Foo< sizeof...(T), T&&...> // to count the arguments
{
return {std::forward<T>(args)...};
}
इसके अलावा, दो आर्ग या तीन आर्ग कार्यों के लिए ऊपर काम करता है, है ना मुश्किल देखने के लिए है इसका विस्तार कैसे करें।
यह लिखने के लिए बहुत सी कोड है! प्रत्येक फंक्शन के लिए आप इसे लागू करेंगे, आप एक मैक्रो लिख सकते हैं जो आपके लिए यह करता है। आपकी फ़ाइल के ऊपरी भाग पर कुछ इस तरह:
REGISTER_FUNCTION_FOR_DEDUCED_RETURN_TYPE(foo); // declares
// necessary structure and auto_???
और फिर आप अपने कार्यक्रम में auto_foo
इस्तेमाल कर सकते हैं।
fwiw मेरे पास कुछ समान था लेकिन कन्स्ट्रक्टर तर्कों के प्रकार के आधार पर रिटर्न प्रकार के साथ। मैंने एक templated सहायक समारोह 'make_complex_template_obj (the args)' बनाया है, इसलिए मैं उस func से चर को init'ing जब 'ऑटो' का उपयोग कर सकते हैं। संभावित रूप से स्वीकार्य उत्तर के समान कारण के लिए, उस टेम्पलेट को 'ऑटो' रिटर्न प्रकार नहीं दिया जा सका। शुक्र है कि मैं 'रिटर्न' में टाइपनाम को डुप्लिकेट करने से बच सकता था, तब तक यह पता था कि किस प्रकार का आ रहा था और एक बेयर _initialiser-list_ को उचित रूप से परिवर्तित किया गया था। काफी रोमांच! –