我正在学习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闭包没有任何泛型类型吗?
答案 0 :(得分:5)
你无法避免它。 Lambda只是一个运算符()()重载的类,它执行你的代码。所以不同的代码 - 不同的类。
答案 1 :(得分:0)
std::function
是lambda闭包的泛型类型。问题是每个lambda可能捕获不同的变量。所以它不能简化为一个函数指针和一些数据,因为lambda可能已经捕获了3个变量,或者它可能已经捕获了4. std::function
将负责确保为数据分配足够的内存,但它需要付出代价(数据可以分配堆)。
但是,如果你想存储几个lambda,你知道在编译时有多少个。您可以将它们存储在std::tuple
中。这允许每个lambda的不同类型。不幸的是,C ++仍然没有提供迭代元组的方法,但你可以使用Boost.Fusion。