Может ли каррирование использоваться с лямбда-функциями?
Эта часть кода не скомпилируется, и я не знаю, является ли это потому, что это невозможно, lambdas не наследует от binary_function, или просто я ошибаюсь в синтаксисе
#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;
}
Ответы
Ответ 1
Использование:
auto sumFive = std::bind(lambda, 5, std::placeholders::_1);
Пожалуйста, забудьте полностью о bind1st
и binary_function
и т.д. Это были костыли в старом С++ из-за отсутствия лямбда и вариативных шаблонов. В С++ 11 используйте std::function
и std::bind
.
Ответ 2
std::bind1st
и std::bind
являются избыточными в С++ 11. Просто используйте другую лямбду:
auto lambda = [](int x, int y) { return x + y; };
auto sumFive = [&](int y) { return lambda(5, y); };
Это проще и проще (не нужно знать, что делает std::bind
или что для него std::placeholders
), более гибким (он может поддерживать любое выражение, а не только привязку параметров), не требует заголовков поддержки и будет вероятно, скомпилировать еще немного быстрее.