8

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

4

3 回答 3

6

不。

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

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

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

于 2013-08-11T15:43:19.910 回答
5

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

这些都不是序列化。

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

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

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

于 2013-08-11T15:25:32.280 回答
0

是的,它是,不,它不是。理论上,您可以序列化函数对象将运行的数据,但无论如何您都需要编译代码,因为如果不求助于丑陋的黑客,您将无法执行数据。

于 2013-08-11T15:13:07.610 回答