c++ - 使用 lambda 作为参数:std::function 还是模板?

标签 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 闭包没有泛型吗?

最佳答案

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

关于c++ - 使用 lambda 作为参数:std::function 还是模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14999138/

相关文章:

c++ - SFINAE:它如何与派生类一起工作?

C++:泛型类中的非泛型方法?

C++11 原子 : does it make sense, 或者甚至可以将它们与内存映射 I/O 一起使用?

c++ - 即使成员没有移动构造函数,移动构造函数也会自动生成?

c++ - 对 STL 列表的子类进行排序

c++错误访问boost fusion 对中的字段类型

c++ - 包含多行函数签名的 Vim foldexpr

c++ - 尝试反转 C 字符串

c++ - 是否可以重载函数以接受具有非类型模板参数的所有实例

templates - C++ 中类似 Haskell 的 `const`