2015-11-29 19 views
8

Sono nuovo di C++ 11 lambda e vorrebbe trasformare un lambda binario in uno unario legandosi suo secondo parametro:È possibile associare il secondo parametro di una funzione lambda?

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

compilazione fallisce con

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

[Come] Può essere fatto?

+6

'lambda2 auto = [lambda1] (int a) {lambda1 ritorno (a, 5); } 'Basta dimenticare' bind', i lambda sono più facili da usare e più leggibili. –

+0

'bind2nd' &' bind1st' sono 'deprecati' e quindi sostituiti con' bind' –

+0

@AnkitAcharya In C++ 17 forse, ma a partire da ora sono ancora validi. Questo è comunque di interesse piuttosto teorico. – oarfish

risposta

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

preferisce anche usare std::bind oltre std::bind1st e std::bind2ndsince both were deprecated in C++11 e sono programmati per essere rimosso in C++ 17.

+0

Questo collega il primo parametro, invece del secondo. Mentre è preferibile avvolgere un altro lambda come suggerito da Columbo, sono comunque curioso di sapere se sia possibile. – oarfish

+0

@oarfish Il codice as si lega il secondo parametro a '5'. – Columbo

+0

Whoops, sì, il test che ho fatto era difettoso. – oarfish

12

Se già impiegano le espressioni lambda, basta usare un altro:

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

In realtà non ci avevo pensato. Silly. – oarfish

+0

Puoi spiegare, * perché * 'std :: bind2nd' non è appropriato? – user2079303

+0

@ user2079303 Perché è deprecato, illeggibile e non flessibile in alcun modo? – Columbo

Problemi correlati