std :: function可以序列化吗?

dan*_*jar 8 c++ theory serialization std-function

这是一个理论问题.假设有一些对象包含订阅这些对象事件的回调函数列表.现在我们要将这些对象存储在磁盘上.是可std::function序列化的吗?

Mat*_* M. 6

没有.

每当使用类型擦除(即隐藏接口后面的实现细节)时,在不知道对象的动态类型的情况下可用的唯一操作是接口提供的操作.

C++标准中没有序列化,也没有简单的方法来序列化函数(没有反射),因此std::function接口不提供序列化.

另一方面,没有什么能阻止使用Callback提供序列化支持的基类.


Yak*_*ont 5

std::function是一种服从价值语义的类型擦除对象.它公开复制/移动构造和赋值,执行特定签名和销毁.

这些都不是序列化.

在内部,典型的实现std::functiontemplate在其construct-from参数上创建一个实现助手类,它将上述操作包装在参数上,然后std::function自己将这些操作的实现委托给助手对象.

该辅助对象的布局将取决于构造的参数的布局(在其存在的基础上是可选的,并且其实现依赖于实现).

您可以尝试创建一个支持序列化的类似对象,但类型擦除对象依赖于被擦除的类型已经实现了相关操作的事实.这意味着您只能从支持函数与序列化接口的对象构造类型擦除函数 - 序列化,至少在ducktype级别.