使用lambda作为参数:标准::功能或模板?(Using lambda as an argumen

2019-07-20 07:21发布

我正在学习C ++ 11拉姆达特别感兴趣。

有些做法后,我认为拉姆达闭包是一个匿名函数对象。

所以我写了这个代码。

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

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

但我发现一个问题,读了这个问题: 为什么我不能创建拉姆达在C ++ 11的载体?

回答者说,“每个拉姆达具有即使它们具有相同的签名不同的类型 - ”。

编译器可以为不同类别不同的​​代码。

所以,我认为我的编译器将使另一个版本lambda_caller每当我做拉姆达的另一种定义来传递。

有什么办法避免它,但使用std::function ? 难道没有任何泛型类型为拉姆达关闭?

Answer 1:

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



Answer 2:

std::function是通用型的拉姆达关闭。 问题是,每个拉姆达可捕捉不同的变量。 因此,它不能被简化地说一个函数指针和一些数据,因为拉姆达可能已抓获3个变量或者它可能已抓获4 std::function将确保足够的内存分配给数据的照顾,但它是有代价的(数据可以堆分配)。

但是,如果你是想存储几个lambda表达式,你知道在编译时有多少。 你可以将它们存储在一个std::tuple来代替。 它允许不同类型的每个拉姆达。 不幸的是,C ++仍然没有提供一种方式来遍历一个元组,但使用Boost.Fusion即可。



文章来源: Using lambda as an argument : std::function or template?