2015-11-29 90 views
8

我是新的C++ 11個lambda表達式,並想通過結合其第二個參數打開二進制拉姆達爲一元一個:是否可以綁定lambda函數的第二個參數?

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

編譯失敗

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

[如何]這可以做到嗎?

+6

'汽車lambda2 = [lambda1](INT一個){回報lambda1(一,5); }'忘記'綁定',lambdas更容易使用,更易讀。 –

+0

'bind2nd'&'bind1st'已被棄用,因此替換爲'bind' –

+0

@AnkitAcharya也許在C++ 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::bind超過std::bind1ststd::bind2ndsince both were deprecated in C++11和被調度要去除在C++ 17。

+0

這將綁定第一個參數,而不是第二個參數。雖然按照Columbo的建議包裝另一個lambda是可取的,但我仍然好奇它是否可能。 – oarfish

+0

@oarfish代碼是將第二個參數綁定到'5'。 – Columbo

+0

哎呀,是的,我做的測試是錯誤的。 – oarfish

12

如果你已經使用lambda表達式,只是用另外一個:

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

我其實並沒有想到這一點。愚蠢。 – oarfish

+0

你能解釋一下,*爲什麼* std :: bind2nd不合適? – user2079303

+0

@ user2079303因爲它已被棄用,難以辨認,而且無論如何都不靈活? – Columbo

相關問題