2015-11-29 2 views
8

Ich bin neu in C++ 11 lambdas und möchte ein binäres Lambda in eine einstelligen verwandeln durch seinen zweiten Parameter Bindung:Ist es möglich, den zweiten Parameter einer Lambda-Funktion zu binden?

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

Compilation nicht mit

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

[Wie] Kann das gemacht werden?

+6

'auto lambda2 = [lambda1] (int a) {return lambda1 (a, 5); } 'Vergessen Sie einfach' bind', lambdas sind einfacher zu benutzen und lesbarer. –

+0

'bind2nd' &' bind1st' sind 'veraltet' und daher durch' bind' ersetzt –

+0

@AnkitAcharya In C++ 17 vielleicht, aber ab sofort sind sie noch gültig. Dies ist ohnehin von eher theoretischem Interesse. – oarfish

Antwort

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

bevorzugen auch std::bind über std::bind1st und std::bind2ndsince both were deprecated in C++11 und geplant verwenden C++ 17 werden entfernt in.

+0

Dies bindet den ersten Parameter anstelle des zweiten. Es ist zwar vorzuziehen, einen anderen Lambda-Code zu verwenden, wie von Columbo vorgeschlagen, aber ich bin immer noch neugierig, ob das möglich ist. – oarfish

+0

@oarfish Der Code wie er bindet den zweiten Parameter an '5'. – Columbo

+0

Hoppla, ja, der Test, den ich gemacht habe, war fehlerhaft. – oarfish

12

Wenn Sie bereits Lambda-Ausdrücke verwenden, benutzen Sie einfach eine andere:

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

Daran hatte ich eigentlich nicht gedacht. Dumm. – oarfish

+0

Können Sie erklären, * warum * 'std :: bind2nd' nicht geeignet ist? – user2079303

+0

@ user2079303 Weil es veraltet, unleserlich und in keiner Weise flexibel ist? – Columbo

Verwandte Themen