2011-08-24 61 views
18

这段代码编译失败,我不知道这是否是因为它无法做到的,lambda表达式不从binary_function继承,或者它只是我得到的语法错误柯里化可以使用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; 
} 

回答

23

用途:

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

请忘记完全约bind1stbinary_function,等等这些都是在旧的C++拐杖因为缺乏lambda表达式和可变参数模板的。在C++ 11中,使用std::functionstd::bind

+0

小修正:lambdas与'std :: bind'和''std :: function''的实现无关 - 而且可变参数模板使它更容易/可以为无限多的参数工作。 – ltjax

+0

@Itjax:是的,谢谢。我在那里结合了几件事。事实上,在C++ 11中,你可以自由绑定任何东西,特别是lambda。另一件我猜测是'std :: function'作为lambda表达式的接收者类型是必需的,它的实际类型是未知的。 –

+0

有一个无法命名的类型是非常奇怪的。 – Omnifarious

8

std::bind1ststd::bind在C++ 11中是多余的。只需使用另一个lambda:

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

这是更清晰,更简单(不需要知道什么std::bind做或什么std::placeholders是),更灵活(它可以支持任何表情,而不仅仅是参数绑定),不需要支持头文件,并且可能会编译得更快一点。

+1

是的,它的工作原理,但这种解决方案是完全反对功能编程范例。 – Cartesius00

+0

@ Cartesius00为什么呢? –