std :: function可以序列化吗?

时间:2013-08-11 15:10:31

标签: c++ serialization theory std-function

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

3 个答案:

答案 0 :(得分:6)

没有

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

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

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

答案 1 :(得分:5)

std::function是一个遵循价值语义的类型擦除对象。它暴露了复制/移动构造和赋值,以及特定签名的执行和破坏。

这些都不是序列化。

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

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

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

答案 2 :(得分:0)

是的,它是,不,它不是。理论上,你可以序列化运行函数对象的数据,但是你仍然需要编译的代码,因为你不能在不诉诸丑陋的黑客的情况下执行数据。