2011-08-24 11 views
18

Ten fragment kodu nie skompilować i nie wiem, czy to dlatego, że nie można tego zrobić, lambdas nie dziedziczą z binary_function, czy to jest tak, że jestem coraz składnię złegoCzy można stosować curry z funkcjami 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; 
} 

Odpowiedz

23

Zastosowanie:

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

Proszę zapomnieć całkowicie o bind1st i binary_function, itd. były to kule w starym C++ ze względu na brak lambdas i zmiennej liczbie argumentów szablonów. W C++ 11 użyj std::function i std::bind.

+0

Drobna korekta: lambdas nie mają nic wspólnego z implementacją 'std :: bind' i' 'std :: function'' - a szablony variadic po prostu ułatwiają/pracują dla nieskończonej liczby parametrów. – ltjax

+0

@Ijax: Tak, dziękuję. W tym czasie skakałem ze sobą kilka rzeczy. Faktem jest, że w C++ 11 możesz dowolnie wiązać wszystko, aw szczególności lambda. Inną rzeczą, jak sądzę, jest to, że 'std :: function' jest niezbędna jako typ odbiorcy lambdas, którego rzeczywisty typ nie jest znany. –

+0

To bardzo dziwne, że istnieje typ, którego nie można nazwać. – Omnifarious

8

std::bind1st i std::bind są zbędne w C++ 11. Wystarczy użyć innego lambda:

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

Jest jaśniejsze i prostsze (nie trzeba wiedzieć, co std::bind robi lub co std::placeholders są za), bardziej elastyczne (może obsługiwać dowolny wyraz, nie tylko parametr wiązania), nie wymaga obsługują nagłówki i prawdopodobnie będą również nieco szybsze.

+1

Tak, to działa, ale to rozwiązanie jest całkowicie sprzeczne z paradygmatem programowania funkcjonalnego. – Cartesius00

+0

@ Cartesius00 dlaczego tak jest? –

Powiązane problemy