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

use*_*192 5 c++ lambda templates c++11

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

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

所以我写了这段代码.

template <class callable_object>
void lambda_caller( callable_object lambda )
{
    std::cout<< sizeof(lambda) << endl;
    lambda();
}
Run Code Online (Sandbox Code Playgroud)

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

但我发现一个问题就是读这个问题:为什么我不能在C++ 11中创建一个lambda向量?

回答说:"每个lambda都有不同的类型 - 即使它们有相同的签名."

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

因此,我认为lambda_caller只要我将lambda的另一个定义传递给我,我的编译器就会生成另一个版本.

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

ixS*_*Sci 5

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