使用lambda作为参数:std :: function或template?

时间:2013-02-21 09:51:34

标签: c++ templates c++11 lambda

我正在学习c ++ 11,特别感兴趣的是lambda。

经过一些练习后,我认为lambda闭包是一个无名函数对象。

所以我写了这段代码。

template <class callable_object>
void lambda_caller( callable_object lambda )
{
    std::cout<< sizeof(lambda) << endl;
    lambda();
}

我知道我可以使用std::function而不是使用模板,但我不希望在进行类型转换时产生开销。

但我在阅读这个问题时发现了一个问题:Why can't I create a vector of lambda in C++11?

回答者说,“每个lambda都有不同的类型 - 即使他们有相同的签名。”。

编译器为不同的类生成不同的代码。

所以我认为只要我对lambda的另一个定义要传递,我的编译器就会生成lambda_caller的另一个版本。

有没有办法避免它,除了使用std::function? lambda闭包没有任何泛型类型吗?

2 个答案:

答案 0 :(得分:5)

你无法避免它。 Lambda只是一个运算符()()重载的类,它执行你的代码。所以不同的代码 - 不同的类。

答案 1 :(得分:0)

std::function是lambda闭包的泛型类型。问题是每个lambda可能捕获不同的变量。所以它不能简化为一个函数指针和一些数据,因为lambda可能已经捕获了3个变量,或者它可能已经捕获了4. std::function将负责确保为数据分配足够的内存,但它需要付出代价(数据可以分配堆)。

但是,如果你想存储几个lambda,你知道在编译时有多少个。您可以将它们存储在std::tuple中。这允许每个lambda的不同类型。不幸的是,C ++仍然没有提供迭代元组的方法,但你可以使用Boost.Fusion