2013-09-26 7 views
5

क्या क्लास एट्रिब्यूट के रूप में लैम्ब्डा अभिव्यक्ति का उपयोग करना संभव है? मैं सी ++ में एक छोटे से गेम पर काम कर रहा हूं जहां सभी बॉट्स में एक ही अद्यतन दिनचर्या है, लेकिन हर किसी के पास अपना वैकल्पिक अतिरिक्त अपडेट दिनचर्या होना चाहिए।एक वर्ग विशेषता के रूप में Lambda अभिव्यक्ति?

मुझे लगता है कि

class Bot 
{ 
private: 
    Lambdatype lambda; 

public: 
    Bot(Lambda l) {lambda = l;} 
    update() { dosomething(); lambda(); } 
}; 
+0

BTW, यह वर्तनी "लैम्ब्डा" का उपयोग कर सकते :) – StilesCrisis

+0

हर लैम्ब्डा अभिव्यक्ति के लिए एक अनूठा प्रकार है, तो मैं यह संभव है नहीं लगता। 'ऑटो एक्स = [] {} पर विचार करें; ऑटो वाई = [] {}; std :: is_same {} // झूठी पैदावार '। – dyp

+0

@StilesCrisis आह, धन्यवाद :) शुरुआती दिनों में मैंने सोचा था कि इसे लिखा जाएगा lambada – user2796729

उत्तर

7

की तरह कुछ आप std::function उपयोग कर सकते हैं सोचा, उदाहरण के लिए यह void समारोह है मान लेते हैं और हो जाता है दो int:

class Bot 
{ 
private: 
    using Lambda = std::function<void(int, int) >; 
    Lambda lambda; 

public: 

    Bot(const Lambda &l) : lambda(l) 
    { 
    } 

    void update() 
    { 
     //dosomething...; 
     lambda(1, 2); 
    } 
}; 

int main() 
{ 
    Bot bot ([](int x, int y){ cout << x+y << endl; }); 

    bot.update(); 
} 

अधिक सामान्य:

template <typename L> 
class Bot 
{ 
private: 
    L lambda; 

public: 

    Bot(const L &l) : lambda(l) 
    { 
    } 

    void update() 
    { 
     //dosomething...; 
     lambda(1, 2); 
    } 
}; 

int main() 
{ 
    Bot<std::function<void(int,int)>> bot (
         [](int x, int y){ cout << x+y << endl; } 
    ); 
    bot.update(); 
} 

खाका आधारित:

template <typename L> 
struct Bot 
{ 
private: 
    L lambda; 

public: 
    Bot(const L &l) : lambda{l} {} 
    void update() { lambda(1,2); } 
}; 

int main() 
{ 
    auto l = [](int x, int y){ std::cout << x + y << std::endl; }; 

    Bot<decltype(l)> bot(l); 

    bot.update(); 
} 
+0

कूल इसे चलाता है, धन्यवाद !! – user2796729

+1

अतिरिक्त लाभ: आप अब लैम्ब्डा तक ही सीमित नहीं हैं, आप किसी भी चीज़ को स्टोर कर सकते हैं जिसमें सही हस्ताक्षर है। – MSalters

1

addional आप make_bot

template< class L > 
struct bot 
{ 
    bot(L l) : lambda{l} {} 
    void update() { lambda(1,2); } 
private: 
    L lambda; 
}; 

template< class L > bot<L> make_bot(L l) { return {l}; } 

int main() 
{ 
    auto my_bot = make_bot([](int x, int y){ std::cout << x + y << std::endl;}) ; 

    my_bot.update(); 
} 
+0

इस तकनीक के साथ समस्या यह है कि प्रत्येक बॉट का अपना लैम्ब्डा प्रकार होता है, और इसलिए इसका अपना 'बॉट ' प्रकार होता है। इसका मतलब है कि अब आप बॉट्स का संग्रह नहीं कर सकते हैं। – MSalters

+0

@MSalters। मदद के लिए आने के लिए std :: tuple :) –

संबंधित मुद्दे