【发布时间】:2017-10-03 11:33:47
【问题描述】:
这是一个不能调用任何 lambda 的 lambda 类的示例。它旨在用作仿函数。
template<class T>
struct lambda_class {
T lambda;
void operator()(){ lambda();}
};
这个类是否有任何尺寸保证。我需要将它存储在联合中,但如果没有特定的模板参数,我不能将它放在联合中。为此,我需要知道 lambda 的最大大小是多少。它何时是特定于编译器的并不重要。
编辑 1: 是的,我的目的是了解 std::function 是如何在内部实现的。出于这个原因,我选择 EASTL 进行理解,因为与 gnu libstdc++ 相比,它的可读性非常好。
以下链接包含似乎仅使用placement new 的函数实现代码: https://github.com/electronicarts/EASTL/blob/master/include/EASTL/internal/function.h
我不明白为什么它适合存储类型?第 131 和 141 行包含函子和分配器的结构定义。当 lambda 与多个捕获的变量绑定时会发生什么?
【问题讨论】:
-
"which cann call any lambda" 你确定吗?这不需要一些可变参数和转发吗?
-
由于 lambda 可以捕获,因此它的大小没有限制,除非机器可以处理。
-
那不是类,是类模板。您不能在任何地方创建它的实例。您似乎正在尝试重新创建
std::function<void()>。 -
不管 lambda 的大小如何,关于“将其存储在联合中”的主题:不要。除非您准备编写一大堆丑陋的代码,以正确实现存储在联合中的对象的构造函数和析构函数语义。这是一个你不能忽视的强制性要求,否则你会得到一些很好的未定义行为,作为你的奖励。使用
std::variant而不是联合,它将为您完成所有繁重的工作。
标签: c++ c++11 templates lambda