C++ lambda 大小

Gus*_*avo 0 c++ lambda templates c++11

这是一个无法调用任何 lambda 的 lambda 类的示例。它旨在用作函子。

template<class T>
struct lambda_class {
 T lambda;
 void operator()(){ lambda();}
};
Run Code Online (Sandbox Code Playgroud)

此类是否有任何尺寸保证。我需要的是将它存储在联合中,但如果没有特定的模板参数,我不能将它放入联合中。为此,我需要知道 lambda 的最大大小是多少。它何时是特定于编译器的并不重要。

编辑 1: 是的,我的目的是了解 std::function 是如何在内部实现的。出于这个原因,我选择 EASTL 进行理解,因为与 gnu libstdc++ 相比,它的可读性非常好。

以下链接包含功能实现的代码,该代码似乎仅使用了placement new:https : //github.com/electronicarts/EASTL/blob/master/include/EASTL/internal/function.h

我不明白的是为什么它适合存储类型?第 131 和 141 行包含函子和分配器的结构体定义。当 lambda 与多个捕获的变量绑定时会发生什么?

Yak*_*ont 5

你似乎想要一个std::function<void()>.

std::function<void()>可以存储任何可以复制和销毁的可调用对象(可以使用 0 个参数调用)。它要么将其存储在内部缓冲区(大到足以存储函数指针)中,要么存储在堆中(如果它太大)。

它通过一种称为类型擦除的机制来做到这一点。

它不是 lambda,但它可以存储 lambda。

在联合中存储非 POD C++ 类有点麻烦。如果您有支持,请考虑使用boost::variantor 。std::variant

如果您想知道如何将模板(而不是模板实例)存储为数据,那么在没有std::functionvariant我的情况下解决这个问题会很困难,并且超出您的技能水平几步。