Можно ли использовать карри с лямбда-функциями? - PullRequest
18 голосов
/ 24 августа 2011

Этот фрагмент кода не скомпилируется, и я не знаю, так ли это, потому что это невозможно, лямбда-выражения не наследуются от двоичной_функции, или просто синтаксис получен неправильно

#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;
}

Ответы [ 2 ]

24 голосов
/ 24 августа 2011

Использование:

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

Пожалуйста, полностью забудьте о bind1st и binary_function и т. Д. Это были костыли в старом C ++ из-за отсутствия лямбда-выражений и шаблонов с переменными числами.В C ++ 11 используйте std::function и std::bind.

8 голосов
/ 06 января 2012

std::bind1st и std::bind являются избыточными в C ++ 11.Просто используйте другую лямбду:

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

Это яснее и проще (не нужно знать, что делает std::bind или для чего std::placeholders), более гибко (может поддерживать любое выражение, а не толькопривязка параметров), не требует поддержки заголовков и, вероятно, будет компилироваться немного быстрее.

...