2015-11-29 11 views
8

私はC++ 11件のラムダに新たなんだとその二番目のパラメータを結合することによって、単項1にバイナリのラムダを回したいと思います:ラムダ関数の2番目のパラメータをバインドすることは可能ですか?

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 A){リターンlambda1(、5); } '単に' bind'を忘れると、lambdaは使いやすく読みやすくなります。 –

+0

'bind2nd'と' bind1st'は 'deprecated'なので、' 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::bindsince both were deprecated in C++11std::bind1st上及びstd::bind2ndを使用することを好むとC++ 17で除去される予定されています。

+0

これは、2番目のパラメータではなく1番目のパラメータをバインドします。 Columboが示唆しているように別のラムダをラップしているのが望ましいですが、私はそれが可能かどうかまだ不思議です。 – oarfish

+0

@oarfishコードasは、2番目のパラメータを '5'にバインドします。 – Columbo

+0

おっと、はい、私がしたテストは間違っていました。 – oarfish

12

すでにちょうど別のものを使用し、ラムダ式を採用した場合:

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

私は実際それを考えていませんでした。愚か。 – oarfish

+0

あなたは説明することができますか?*なぜ* 'std :: bind2nd'は適切ではありませんか? – user2079303

+0

@ user2079303これは非難され、判読不能であり、いかなる形であれフレキシブルではないためですか? – Columbo

関連する問題