2015-11-29 23 views
8

मैं सी ++ 11 lambdas के लिए नया हूँ और एक एकल में अपने दूसरे पैरामीटर जुड़ कर एक द्विआधारी लैम्ब्डा चालू करने के लिए करना चाहते हैं:क्या लैम्ब्डा फ़ंक्शन के दूसरे पैरामीटर को बांधना संभव है?

error: no type named 'first_argument_type' in 'struct main(int, char**)::<lambda(int, int)>' 
    class binder2nd 

साथ

auto lambda1 = [] (int a, int b) { return a+b; }; 
auto lambda2 = std::bind2nd(lambda1, 5); 

संकलन में विफल रहता है [कैसे] क्या यह किया जा सकता है?

+6

'ऑटो lambda2 = [lambda1] (पूर्णांक एक) {वापसी lambda1 (एक, 5); } 'बस' बाइंड 'भूल जाओ, लैम्ब्डा का उपयोग करना आसान है और अधिक पठनीय है। –

+0

'bind2nd' और' 'bind1st' deprecated' और इसलिए साथ प्रतिस्थापित कर रहे हैं' –

+0

@AnkitAcharya bind' सी ++ 17 शायद में, लेकिन अब के रूप में वे अभी भी मान्य हैं। यह वैसे भी सैद्धांतिक हित में है। – oarfish

उत्तर

8
#include <functional> 

int main(int argc, char *argv[]) 
{ 
    auto lambda1 = [](int a, int b) { return a+b; }; 
    auto lambda2 = std::bind(lambda1, std::placeholders::_1, 5); 
    //   ~~~~~~~^^^^~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^~~~ 
    return 0; 
} 

Demo

इसके अलावा std::bindstd::bind1st और std::bind2ndsince both were deprecated in C++11 से अधिक उपयोग करने के लिए पसंद करते हैं और में हटा दिया जाना चाहिए सी ++ 17 निर्धारित हैं।

+0

यह दूसरे के बजाए पहला पैरामीटर बांधता है। कोल्म्बो द्वारा सुझाए गए एक और लैम्ब्डा को लपेटने के दौरान बेहतर है, मैं अभी भी उत्सुक हूं कि यह संभव है या नहीं। – oarfish

+0

@oarfish कोड दूसरे पैरामीटर को '5' से बांधता है। – Columbo

+0

ओह, हाँ, मैंने जो परीक्षण किया वह दोषपूर्ण था। – oarfish

12

आप पहले से ही लैम्ब्डा भाव काम में लेते हैं, सिर्फ एक और एक का उपयोग करें:

auto lambda2 = [&] (int i) {return lambda1(i, 5);}; 
+0

मैंने वास्तव में इसके बारे में सोचा नहीं था। बेवकूफ। – oarfish

+0

क्या आप समझा सकते हैं, * क्यों * 'std :: bind2nd' उपयुक्त नहीं है? – user2079303

+0

@ user2079303 क्योंकि यह है, तो बहिष्कृत अस्पष्ट और किसी भी तरह से लचीला नहीं है? – Columbo

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