सी ++ 11 में पैरामीटर/स्टोरेज प्रकार, आप एक फ़ंक्शन घोषित करते हैं जो लैम्बडा अभिव्यक्ति को तर्क के रूप में लेता है? मुझे लैम्ब्डा घोषित करने या उन्हें टेम्पलेट पैरामीटर के रूप में लेने के लिए ऑनलाइन संसाधनों का बहुत कुछ मिल सकता है, लेकिन मैं वास्तव में क्या करना चाहता हूं, यह लैम्बडास को कॉलबैक हैंडलर को आसानी से घोषित करने में सक्षम है, जो बंद होने से संभव हो गया है जावास्क्रिप्ट में और उद्देश्य-सी में कोड ब्लॉक।सी ++ 11 लैम्ब्डा
class MyCallback {
public:
virtual ~MyCallback() {}
virtual void operator(int arg) = 0;
};
void registerCallback(const std::shared_ptr<MyCallback> &);
void foo(void) {
int a, b, c;
class LocalCallback: public MyCallback {
int a, b, c;
public:
LocalCallback(int a, int b, int c): a(a), b(b), c(c) {}
void operator(int arg) { std::cout << (a+b+c)*arg << std::endl; }
};
registerCallback(std::shared_ptr<MyCallback>(new LocalCallback(a,b,c)));
}
जिसमें सरलीकृत किया जाएगा:
void registerCallback(/* WHAT GOES HERE? */);
void foo(void) {
int a, b, c;
registerCallback([=](int arg){std::cout << (a+b+c)*arg << std::endl; })
}
तो, जहाँ मैं /* WHAT GOES HERE? */
जो लिखा है उसे हो जाता है
अनिवार्य रूप से, क्लासिक सी ++ का निर्माण मैं एक लैम्ब्डा के साथ बदलना चाहते हैं कुछ की तरह है ?
संपादित करें: यह तुरंत कॉल करने और कॉल करने के बजाए कॉलबैक को स्टोर करने के उद्देश्य से वापस कॉल करने के उद्देश्य से है।
स्थानीय प्रकारों का उपयोग टेम्पलेट तर्कों के रूप में C++ 03 में कानूनी नहीं है। कुछ कंपाइलर इसे एक विस्तार के रूप में अनुमति देते हैं। – bames53
लैम्ब्डा का लाभ यह है कि यह कॉलबैक लिखना आसान बनाता है। आप विशेष रूप से कोड नहीं लिखते हैं जिसका प्रयोग लैम्बडास के साथ किया जाएगा, आप केवल कोड लिखेंगे जो 'फ़ंक्शन' तर्क लेगा और कॉलर लैम्बडा का उपयोग (या नहीं) कर सकता है। –
@ barnes53 मेरे द्वारा पोस्ट किया गया कोड स्थानीय प्रकारों को टेम्पलेट तर्क के रूप में उपयोग नहीं करता है। MyCallback एक वैश्विक है, और स्थानीय प्रकार std :: shared_ptr में लपेटा जा रहा है। मैं हर समय काम पर इस पैटर्न का उपयोग करता हूं, यही कारण है कि मुझे सी ++ 11 के तरीके में दिलचस्पी है। :) –
fluffy