C++ C++;λ尺寸

C++ C++;λ尺寸,c++,c++11,templates,lambda,c++17,C++,C++11,Templates,Lambda,C++17,这是一个lambda类的示例,它可以调用任何lambda。它打算用作函子 template<class T> struct lambda_class { T lambda; void operator()(){ lambda();} }; 模板 结构lambda_类{ T lambda; void运算符(){lambda();} }; 这个级别有尺码保证吗。我需要的是将其存储在一个联合体中,但如果没有特定的模板参数,我无法将其放入联合体中。为此,我需要知道lambda的最大尺

这是一个lambda类的示例,它可以调用任何lambda。它打算用作函子

template<class T>
struct lambda_class {
 T lambda;
 void operator()(){ lambda();}
};
模板
结构lambda_类{
T lambda;
void运算符(){lambda();}
};
这个级别有尺码保证吗。我需要的是将其存储在一个联合体中,但如果没有特定的模板参数,我无法将其放入联合体中。为此,我需要知道lambda的最大尺寸是多少。它是特定于编译器的,这并不重要

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

以下链接包含函数实现的代码,该函数实现似乎只使用新的位置:


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

您似乎想要一个
std::function

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

它通过一种称为类型擦除的机制来实现这一点

它不是lambda,但可以存储lambda

在一个联合体中存储非POD C++类是一个痛苦。考虑使用<代码> Boo::变体或<代码> STD::如果支持,变体< /代码>。< /P>


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

您似乎想要一个
std::function

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

它通过一种称为类型擦除的机制来实现这一点

它不是lambda,但可以存储lambda

在一个联合体中存储非POD C++类是一个痛苦。考虑使用<代码> Boo::变体或<代码> STD::如果支持,变体< /代码>。< /P>


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

“哪个可以称为lambda”你确定吗?这难道不需要一些可变参数和转发吗?因为lambda可以捕获,所以除了机器可以处理的以外,它的大小没有限制……这不是一个类,而是一个类模板。你不能在任何地方创建它的实例。看起来您正在尝试重新创建
std::function
。无论lambda的大小,在主题为“将其存储在联合体中”时:不要。除非您准备编写一大堆难看的代码来正确实现存储在联合中的对象的构造函数和析构函数语义,否则就不会这样做。这是一个你不能忽视的强制性要求,否则你会得到一个很好的未定义行为的捆绑,作为你的奖励。使用
std::variant
,而不是工会,它将为您完成所有繁重的工作。“哪一个可以称为lambda”您确定吗?这难道不需要一些可变参数和转发吗?因为lambda可以捕获,所以除了机器可以处理的以外,它的大小没有限制……这不是一个类,而是一个类模板。你不能在任何地方创建它的实例。看起来您正在尝试重新创建
std::function
。无论lambda的大小,在主题为“将其存储在联合体中”时:不要。除非您准备编写一大堆难看的代码来正确实现存储在联合中的对象的构造函数和析构函数语义,否则就不会这样做。这是一个你不能忽视的强制性要求,否则你会得到一个很好的未定义行为的捆绑,作为你的奖励。使用
std::variant
,而不是联合,它将为您完成所有繁重的工作。我的目的是避免使用堆。目前,这似乎很难。使用堆内存会很容易。@Gustavo提出以下问题:“我希望有一个不使用堆的
std::function
。我可以不使用所有的lambda,但理想情况下,如果我使用太大的lambda,我希望它在构建时中断。”——或者,更确切地说,尝试编写它,当你遇到问题时,再来问更多的问题。了解类型擦除、std函数、std::对齐存储、新放置等。好的,那么最后一个问题是:不使用动态内存分配是否可能?在我看来,这不是不知道函子对象的最大存储大小。使用heap时,我可以使用基类和模板化子类。@Gustavo是的,如果您愿意绑定存储的lambda的最大大小/对齐方式。这可以在编译时检查,因此如果试图存储过大的lambda,则会出现生成错误。您仍然可以使用虚拟分派解决方案进行类型擦除,但在处理SBO存储对象时,我更喜欢使用手动vtable解决方案进行类型擦除。我的目的是避免使用堆。目前,这似乎很难。使用堆内存会很容易。@Gustavo提出以下问题:“我希望有一个不使用堆的
std::function
。我可以不使用所有的lambda,但理想情况下,如果我使用太大的lambda,我希望它在构建时中断。”——或者,更确切地说,试着编写它,并与其他人合作