2011-11-11 16 views
14

संभव डुप्लिकेट:
Bind Vs Lambda?क्या std :: lambdas की तुलना में अभी भी उपयोगी है?

std::bind का मेरा उपयोग 0 को छोड़ दिया था कि अब lambdas व्यापक समर्थन प्राप्त की है।

क्या कोई समस्या है std::bind लैम्बडा फ़ंक्शन के लिए विशिष्ट रूप से उपयुक्त है?

क्या एक बार lambdas में मानक में std::bind रखने के लिए एक अनिवार्य कारण था?

+3

यदि तर्क प्रकार लंबा हैं तो बाइंड अभी भी ambfar__ lambdas से अधिक संक्षिप्त हो सकता है। – ildjarn

+1

http://stackoverflow.com/questions/1930903/bind-vs-lambda/4581747#4581747 –

+1

वे अभी भी सुंदर ऑर्थोगोनल आईएमओ हैं। –

उत्तर

21

आप मूल्य से या संदर्भ द्वारा कब्जा कर सकते हैं और समस्या मान द्वारा कि कब्जा है वास्तव में से 'पर कब्जा का मतलब नकल '। यह केवल एक चाल के प्रकार के लिए एक शो स्टॉपर है।

struct foo { void bar() {} }; 

std::unique_ptr<foo> f { new foo }; 
auto bound = std::bind(&foo::bar, std::move(f)); 
static_assert(std::is_move_constructible<decltype(bound)>::value, ""); 
bound(); 

IIRC मानक समिति संक्षेप में यह (जो [std::move(f)] { return f.bar(); } की तरह लग सकता है) को हल करने के लिए एक लैम्ब्डा कब्जा सूची के अंदर मनमाने ढंग से अभिव्यक्ति की इजाजत दी करार दिया, लेकिन नहीं मुझे क्या करना: तो आप निम्न कार्य करना एक लैम्ब्डा उपयोग नहीं कर सकते लगता है कि एक ठोस प्रस्ताव था और सी ++ 11 देर से चल रहा था।

लैम्बडास के साथ मोनोमोर्फिक व्यवहार के लिए प्रतिबंध और मेरे लिए सौदा ब्रेकर हैं।

+1

अच्छा उदाहरण! क्या 'बाइंड' ऑब्जेक्ट गतिशील 'foo' ऑब्जेक्ट का मालिक बनता है? क्या यह स्वयं गैर-प्रतिलिपि बन जाता है? –

+0

@KerrekSB बिल्कुल, दोनों खातों पर। –

+0

@Luc महान उदाहरण, मैं बिल्कुल इस के लिए देख रहा था। मेरा शेष मुद्दा यह है कि बाइंड अभिव्यक्ति std :: function को असाइन नहीं की जा सकती है। यह अद्वितीय_ptr के बिना और हालांकि कदम के बिना कर सकते हैं। क्या किसी अन्य समारोह में कॉलबैक के रूप में बाध्य करने का कोई तरीका है? (इरादा यह है कि कॉलबैक ऑब्जेक्ट का मालिक है, और कॉलबैक स्वयं नष्ट होने के बाद इसे हटा देता है)। –

4

bind बाध्य सदस्य समारोह के लिए संदर्भ बनाने के लिए अच्छा है:

Foo x; 
auto f = std::bind(&Foo::bar, &x, 12, true); 
register_callback(f); 

संपादित करें: ल्यूक डेंटन दर्शाता के रूप में, इस निर्माण बहुत लचीला है और के लिए उदाहरण के सूचक guises की एक आश्चर्यजनक विविधता में आते हैं के लिए अनुमति देता (उदाहरण के लिए स्मार्ट पॉइंटर्स)। [/]

यदि व्यवहार्य है, तो लैम्ब्डा शायद बेहतर है, खासकर जब से यह अनुकूलन के लिए अधिक क्षमता प्रदान करता है, लेकिन बाध्य-अभिव्यक्तियों में अभी भी उनकी जगह है।

(जो भी हो, auto बेहतर std::function से अधिक प्रकार प्रतिदेय वस्तु स्टोर करने के लिए के लिए है।)

+2

बाइंड बहुत अच्छा है लेकिन लैम्बडा बेहतर हैं। यह 'ऑटो एफ = [& x]() {वापसी x.bar (12, सत्य); }; 'बहुत संक्षिप्त है। तो फिर, जब 'std :: bind' को प्राथमिकता दी जाएगी? –

+0

@deft_code: हम्म ... अंत में प्लेसहोल्डर में 'बाइंड' भरता है (मेरा 'एफ' अभी भी बहुत सारे तर्क ले सकता है), तो शायद यह क्लीनर है जब बाइंड अभिव्यक्ति कहीं टेम्पलेट का हिस्सा है। लेकिन यह एक अच्छा सवाल है! –

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