test
नामक एक फ़ंक्शन std :: function <> इसके पैरामीटर के रूप में लेता है।सी ++ 11 variadic std :: फ़ंक्शन पैरामीटर
template<typename R, typename ...A>
void test(std::function<R(A...)> f)
{
// ...
}
लेकिन, अगर मैं निम्न कार्य करें:
void foo(int n) { /* ... */ }
// ...
test(foo);
संकलक (जीसीसी 4.6.1) का कहना है no matching function for call to test(void (&)(int))
।
अंतिम पंक्ति test(foo)
को संकलित और ठीक से काम करने के लिए, मैं test()
फ़ंक्शन को कैसे संशोधित कर सकता हूं? test()
फ़ंक्शन में, मुझे f
की आवश्यकता है std :: function <> के प्रकार के साथ।
मेरा मतलब है, क्या कंपाइलर फ़ंक्शन के हस्ताक्षर (foo
उदाहरण में) निर्धारित करने के लिए कोई टेम्पलेट चाल है, और इसे स्वचालित रूप से std::function<void(int)>
में परिवर्तित कर देता है?
संपादित
मैं lambdas (दोनों ने कहा और स्टेटलेस) और साथ ही के लिए यह काम करना चाहते हैं।
क्या lambdas के बारे में (दोनों ने कहा और स्टेटलेस)? –
@ डैनियल आप भाग्य से बाहर हैं। या 'टेस्ट' एक टेम्पलेट बनाएं जो कुछ भी स्वीकार करता है ('टी')। 'std :: function' असंगत फ़ंक्शन ऑब्जेक्ट्स को वैसे भी अस्वीकार नहीं करेगा, इसलिए फ़ंक्शन टेम्पलेट पैरामीटर के प्रकार को सीमित करने का उद्देश्य यहां मेरे लिए बहुत उपयोगी नहीं लगता है। –
मैंने '(टी)' के साथ प्रयास किया, लेकिन, इसे 'std :: function' पर कैसे बनाया जा सकता है? ऐसा लगता है कि मैं 'std :: result_of <>' का उपयोग करके 'आर' प्राप्त कर सकता हूं, लेकिन 'ए ...'? –