2011-08-24 12 views
18

Questo pezzo di codice non riesce a compilare e non so se è perché non può essere fatto, lambda non ereditano da binary_function, o è solo che sto ricevendo la sintassi sbagliataÈ possibile utilizzare il curry con le funzioni lambda?

#include <functional> 

int main(int argc, const char *argv[]) 
{ 
    auto lambda = [](int x, int y) -> int { return x + y; }; 
    auto sumFive = std::bind1st(lambda, 5); 

    return 0; 
} 

risposta

23

Usa:

auto sumFive = std::bind(lambda, 5, std::placeholders::_1); 

Si prega di dimenticare tutto su bind1st e binary_function, ecc Quelli erano le stampelle nella vecchia C++ a causa della mancanza di lambda e modelli variadic. In C++ 11, utilizzare std::function e std::bind.

+0

Correzione minore: lambda non ha nulla a che fare con l'implementazione di 'std :: bind' e' 'std :: function'' - ei modelli variadici semplificano/funzionano per un numero infinito di parametri. – ltjax

+0

@Itjax: Sì, grazie. Stavo ammassando un paio di cose insieme lì. Il fatto è che in C++ 11 puoi legare liberamente qualsiasi cosa, in particolare lambda. L'altra cosa credo sia che 'std :: function' sia necessario come tipo di destinatario per lambda, il cui tipo effettivo non è noto. –

+0

È molto strano avere un tipo che non può essere nominato. – Omnifarious

8

std::bind1st e std::bind sono ridondanti in C++ 11. Basta usare un'altra lambda:

auto lambda = [](int x, int y) { return x + y; }; 
auto sumFive = [&](int y) { return lambda(5, y); }; 

Questo è più chiara e più semplice (non c'è bisogno di sapere che cosa std::bind fa o ciò che la std::placeholders sono per), più flessibile (è in grado di supportare qualsiasi espressione, non solo parametro vincolante), non richiede supporta le intestazioni e probabilmente compilerà anche un po 'più veloce.

+1

Sì, funziona, ma questa soluzione è completamente contro il paradigma della programmazione funzionale. – Cartesius00

+0

@ Cartesius00 perché è così? –

Problemi correlati