std::函数是否可以序列化

Can std::function be serialized?

本文关键字:序列化 是否 函数 std      更新时间:2023-10-16

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

否。

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

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

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

std::function是一个遵守值语义的类型擦除对象。它公开复制/移动构造和分配,以及特定签名的执行和销毁。

这些都不是序列化。

在内部,std::function的典型实现是在其构造自参数上创建一个实现助手template类,该类将上述操作封装在参数上,然后std::function本身将这些操作的实现委托给助手对象。

该辅助对象的布局将取决于从中构建的参数的布局(除此之外,它的存在是可选的,它的实现是依赖于实现的)。

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

是的,是的,不是的。理论上,您可以序列化函数对象将在其上运行的数据,但无论如何都需要编译代码,因为执行数据时不需要使用难看的技巧。