5

我正在学习 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_caller在我对 lambda 进行另一个定义时创建另一个版本来传递。

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

4

2 回答 2

5

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

于 2013-02-21T10:01:57.813 回答
0

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

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

于 2013-02-21T22:54:07.720 回答