我正在学习c++11,特别关注lambda表达式。
经过一些实践,我认为lambda闭包是一个无名函数对象。
于是我写了这段代码。
template <class callable_object>
void lambda_caller( callable_object lambda )
{
std::cout<< sizeof(lambda) << endl;
lambda();
}
我知道我可以使用
std::function
来代替使用模板,但我不想在类型转换时产生额外的开销。但是我在阅读以下问题时发现了一个问题:为什么我不能在C++11中创建lambda向量? 回答者说,“每个lambda都有不同的类型-即使它们具有相同的签名。”
编译器为不同的类制作不同的代码。
因此,我认为每当我定义另一个lambda才能通过时,我的编译器将会创建另一个版本的
lambda_caller
。除了使用
std::function
之外,还有什么方法可以避免这种情况吗?是否有任何通用类型适用于lambda闭包?
std::function
不就是专门为此而设计的吗?您可以编写自己的包装器,为 lambda 提供相同的对象类型,并允许您透明地调用绑定到它的任何不同 lambda。如果您编写了一个好的实现,最终会得到std::function
(或类似的东西)。 - utnapistimstd::function
。而std::function
的作用是用于存储可调用对象。 - Xeostd::function
作为输入参数(回调、事件通知接收器、错误处理策略等)。 - utnapistimstd::function
通常不会为您节省任何东西(除了在运行时更麻烦和昂贵之外):典型的实现将具有模板构造函数,因此不同的函数对象类型将产生该构造函数的不同实例化。很可能还会有更多内部模板机制实例化。您现在拥有的代码是最小的--几乎没有什么需要更改的。 - Luc Danton