मैं टेम्पलेट फ़ंक्शन बनाने की कोशिश कर रहा हूं जिसमें किसी अन्य प्रकार को पैरामीटर की संख्या और पैरामीटर के साथ पास करना संभव है और इसे std::function
पर बाध्य करें। मैं यह कर में कामयाब रहे:वैराडिक टेम्पलेट्स, टाइप कटौती और std :: function
#include <iostream>
#include <functional>
int foo(int bar)
{
std::cout << bar << std::endl;
return bar;
}
template <typename Ret, typename... Args>
std::function<Ret (Args...)> func(std::function<Ret (Args...)> f)
{
return f;
}
int main()
{
//auto barp = func(foo); // compilation error
auto bar = func(std::function<void (int)>(foo));
bar (0); // prints 0
}
मैं सिर्फ auto barp = func(foo);
फोन और प्रकार निष्कर्ष निकाला है, लेकिन इस लाइन निम्नलिखित संकलन त्रुटियों देता है चाहते हैं:
error: no matching function for call to ‘func(void (&)(int))’
auto barp = func(foo);
^
note: candidate is:
note: template<class Ret, class ... Args> std::function<_Res(_ArgTypes ...)> func(std::function<_Res(_ArgTypes ...)>)
std::function<Ret (Args...)> func(std::function<Ret (Args...)> f)
^
note: template argument deduction/substitution failed:
note: mismatched types ‘std::function<_Res(_ArgTypes ...)>’ and ‘int (*)(int)’
auto barp = func(foo);
^
क्यों इसके साथ std::function<_Res(_ArgTypes ...)>
मिलान करने के लिए कोशिश कर रहा है int (*)(int)
? मुझे लगता है कि मुझे कंपाइलर को _Res(_ArgTypes ...)
से int(int)
तक विस्तारित करना चाहिए, लेकिन कैसे?
क्यों आप सब पर एक 'एसटीडी करने के लिए परिवर्तित कर रहे हैं :: function'? 'std :: function' एक प्रकार का एरर क्लास है: यह किस प्रकार से बनाया गया है, इसकी टाइप जानकारी लेता है, और इसमें से अधिकांश को मिटा देता है। टाइप कटौती इसकी तर्क लेती है, और इसके प्रकार को घटाती है, और कोड उत्पन्न करती है। आप कम करने के लिए कह रहे हैं कि किस प्रकार से कुछ मिटाना है। यह कवच का एक सूट बनाने जैसा है जो पहनने वाले को गोली मारने के लिए बंदूक बनाता है; टाइप इरेशन अधिकांश इंद्रियों में * विपरीत * प्रकार की कटौती है। यह बहुत ही कम विचार है। यह संभव है, लेकिन सी ++ के पास इसे आसान बनाने का कोई कारण नहीं है * आसान * क्या आपके पास व्यावहारिक उपयोग का मामला है? – Yakk
अधिभार, या परिवर्तनीय तर्क सूचियों के बारे में क्या? केवल कुछ परिस्थितियों में यह संभव है। हालांकि आप बूस्ट function_traits जैसे चीजों का उपयोग कर सकते हैं। – tahsmith
@Yakk, मैं एक "ज्ञापन" फ़ंक्शन को कोड करने का प्रयास कर रहा था, इस अर्थ में कि यह उसी पैरामीटर के साथ एक कॉल करने योग्य लौटाएगा और इसके तर्क का रिटर्न प्रकार होगा जो मूल फ़ंक्शन को कॉल करेगा, सिवाय इसके कि यह पिछले गणना वाले मानों को देखेगा (एक उपयुक्त मानचित्र में संग्रहीत करने के लिए)। मैं मूल फ़ंक्शन को संग्रहीत करने के लिए 'std :: function' का उपयोग करूंगा। यकीन नहीं है कि यह संभव है हालांकि। – Tarc