2010-05-13 20 views
10

C++ 0x कोड का निम्न भाग पर विचार करें:बढ़ावा लैम्ब्डा का सही उपयोग

a_signal.connect([](int i) { 
    if(boost::any_cast<std::string>(_buffer[i]) == "foo") 
    { 
    base_class<>* an_object = new derived_class(); 
    an_object->a_method(_buffer[i]); 
    }}); 

कैसे इसे सही ढंग से बूस्ट लैम्ब्डा में लगेगा (के बाद से इस C++ 0x सुविधा जीसीसी 4.4 में नहीं किया जा सकता अभी तक)?

+0

आप * संकलक यह समर्थन करता है तो * C++ 0x सुविधा का उपयोग कर सकते हैं। – kennytm

+2

ओएमजी, दर्द! इसे रोक! (अच्छा सवाल, हालांकि।) –

+0

@ केनीटीएम मेरे पास जीसीसी 4.4 है और यह अभी तक इसका समर्थन नहीं करता है। जीसीसी 4.5 इसका समर्थन करता है (afaik) लेकिन मैं इसका उपयोग नहीं कर सकता। मैं सवाल संपादित करूंगा ... –

उत्तर

11

मुझे लगता है कि यह काम करना चाहिए:

a_signal.connect(if_then(
        bind((std::string(*)(any&))&any_cast, var(_buffer)[_1]) == "foo", 
        bind(&base_class<>::a_method, 
        ll_static_cast< base_class<>* >(
        new_ptr<derived_class>() 
        ), 
        var(_buffer)[_1] 
        ) 
       ) 
); 

bind, if_then, ll_static_cast, new_ptr, _1, var (और, मुझे लगता है ref भी) boost::lambda के सदस्य हैं।

लेकिन ईमानदारी से, मैं इस तरह के कोड के साथ काम करने, व्यक्तिगत रूप से इन्कार कर देंगे :)

+2

+1 यह भयानक लग रहा है :) –

+0

धन्यवाद। अगर मैं सी ++ 0x पूरी तरह से उपयोग कर सकता हूं तो मैं वास्तव में खुश रहूंगा :)। आपके समाधान के साथ मुझे '_buffer [_1]' कहलाए जाने वाले लाइनों में ऑपरेटर [] 'के लिए कोई मिलान नहीं मिलता है .. लेकिन' ऑपरेटर [] 'बफर क्लास में मौजूद है। क्या आपको पता है कि इसे कैसे हल किया जाए? –

+0

@Niels, मैं उन्हें 'var (..)' में लपेटना भूल गया। फिक्स्ड :) –

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