2011-01-05 12 views
15

मेरे पास कुछ लैम्ब्डा फ़ंक्शंस हैं जिन्हें मैं बूस्ट :: बाइंड या std :: बाइंड का उपयोग करके बांधना चाहता हूं। (परवाह मत करो जो एक, जब तक यह काम करता है।) दुर्भाग्य से उन दोनों ने मुझे अलग संकलक मिली त्रुटियाँ दे:बूस्ट के साथ लैम्ब्डा फ़ंक्शंस का उपयोग कैसे करें :: bind/std :: VC++ 2010 में बाध्य करें?

auto f = [](){ cout<<"f()"<<endl; }; 
auto f2 = [](int x){ cout<<"f2() x="<<x<<endl; }; 

std::bind(f)(); //ok 
std::bind(f2, 13)(); //error C2903: 'result' : symbol is neither a class template nor a function template 

boost::bind(f)(); //error C2039: 'result_type' : is not a member of '`anonymous-namespace'::<lambda0>' 
boost::bind(f2, 13)(); //error C2039: 'result_type' : is not a member of '`anonymous-namespace'::<lambda1>' 

तो, यह के लिए सबसे आसान तरीके को क्या है?

+0

आप बाइंड का उपयोग क्यों करना चाहते हैं? क्या आप सिर्फ एफ() या एफ 2 (1) नहीं कह सकते हैं? – Jagannath

+3

@ जगन्नाथ: यह निश्चित रूप से एक साधारण उदाहरण था, लेकिन हकीकत में मैं बाध्य परिणाम को फ़ंक्शन ऑब्जेक्ट में स्टोर करना चाहता हूं। – Timo

+0

आप बाइंड का उपयोग क्यों करना चाहते हैं? मैंने सोचा कि सी ++ 0 एक्स बंद हो गया है? –

उत्तर

20

आप मैन्युअल रूप से वापसी प्रकार निर्दिष्ट करना होगा:

boost::bind<void>(f)(); 
boost::bind<int>(f2, 13)(); 

तुम भी अपने आप को पूर्ण रूप से अपने अपने लैम्ब्डा के ऑपरेटर (निरीक्षण करने के लिए Boost.FunctionTypes का उपयोग कर वापसी प्रकार निकालना एक टेम्पलेट समारोह लिख सकते हैं), अगर आप डॉन स्पष्ट रूप से बांधने के लिए पसंद नहीं है।

8
std::function<void()> f1 = [](){ std::cout<<"f1()"<<std::endl; }; 
std::function<void (int)> f2 = [](int x){ std::cout<<"f2() x="<<x<<std::endl; }; 
boost::function<void()> f3 = [](){ std::cout<<"f3()"<<std::endl; }; 
boost::function<void (int)> f4 = [](int x){ std::cout<<"f4() x="<<x<<std::endl; }; 

//do you still wanna bind? 
std::bind(f1)(); //ok 
std::bind(f2, 13)(); //ok 
std::bind(f3)(); //ok 
std::bind(f4, 13)(); //ok 

//do you still wanna bind? 
boost::bind(f1)(); //ok 
boost::bind(f2, 13)(); //ok 
boost::bind(f3)(); //ok 
boost::bind(f4, 13)(); //ok 
+0

केवल तभी 'फ़ंक्शन' रनटाइम-इंडिकेशन प्रस्तुत करता है और 'बाइंड' तेज़ है ... क्या यह है? – Dario

+0

मुझे संदेह है कि बाध्य से उत्पन्न होने वाले मज़ेदार को कभी भी तेज़ी से तेज किया जाएगा क्योंकि बाध्य परिणाम ज्यादातर मामलों में अभी तक एक और स्तर का संकेत जोड़ता है। बाध्य शायद उन परिस्थितियों में आवश्यक होगा जहां कुछ मानकों को बाध्य करने की आवश्यकता है। उपर्युक्त उदाहरण में std :: bind (f2, 13)(); निरंतर मान 13 के पहले पैरामीटर को बांधता है। बांध का परिणाम एक "मज़ेदार" है जो कोई पैरामीटर नहीं लेता है और शून्य लौटाता है। – ds27680

+0

'बाइंड' के परिणाम को कॉल करना थोड़ा तेज हो सकता है, क्योंकि 'फ़ंक्शन' के साथ वर्चुअल फ़ंक्शन के माध्यम से कोई कॉल नहीं है। – ltjax

1

मुझे लगता है कि आपको this MSDN forum post में रुचि हो सकती है। पोस्टर की तरह लगता है कि आपके जैसी ही समस्या थी, और एमएस कनेक्ट के साथ एक बग दर्ज किया गया।

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