std::函数是否可以序列化
Can std::function be serialized?
这是一个理论问题。假设有一些对象包含订阅了这些对象的事件的回调函数列表。现在我们要将这些对象存储在磁盘上。std::function
是否可序列化?
否。
每当使用类型擦除(即在接口后面隐藏实现细节)时,在不知道对象的动态类型的情况下,唯一可用的操作就是接口提供的操作。
C++标准中没有序列化,也没有简单的方法来序列化函数(无反射),因此std::function
接口不提供序列化。
另一方面,没有什么可以阻止您使用提供序列化支持的Callback
基类。
std::function
是一个遵守值语义的类型擦除对象。它公开复制/移动构造和分配,以及特定签名的执行和销毁。
这些都不是序列化。
在内部,std::function
的典型实现是在其构造自参数上创建一个实现助手template
类,该类将上述操作封装在参数上,然后std::function
本身将这些操作的实现委托给助手对象。
该辅助对象的布局将取决于从中构建的参数的布局(除此之外,它的存在是可选的,它的实现是依赖于实现的)。
您可以尝试创建一个支持序列化的类似对象,但类型擦除对象依赖于被擦除的类型已经实现了有问题的操作这一事实。这意味着您只能从至少在ducktype级别支持具有序列化接口的函数的对象构造具有序列化的类型擦除函数。
是的,是的,不是的。理论上,您可以序列化函数对象将在其上运行的数据,但无论如何都需要编译代码,因为执行数据时不需要使用难看的技巧。
相关文章:
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- 对于不同的语言,是否有任何稳定的序列化方法?
- 我们是否需要序列化 VAO 和 VBO
- 在对象序列化期间添加额外参数是否有更好的方法?
- 是否可以序列化 QSettings 然后恢复它们?
- 是否可以反序列化(从原始内存块)没有默认构造函数的对象?
- 如何通过其手柄判断堆是否序列化
- 我们如何在c 中序列化或应对类的对象.是否有任何预定义的库
- 是否有一种方法可以使用Boost Serialization序列化迭代器
- 从本机C++结构构建时,是否可以优化平面缓冲区序列化
- 我在处理序列化时是否应该硬码变量大小?C
- 是否可以简单地序列化C++对象
- 是否可以序列化 AutoCAD 实体
- 写入函数是否在 C++ 中使用 ASCII 序列化对象
- 在使用 boost::序列化时,是否应该序列化没有成员变量的基本对象
- boost::序列化:是否可以避免模板函数
- 在 Boost::Serialise 中序列化类的非侵入式方法是否使类可序列化
- 可变长度数据和零长度数组的二进制序列化,是否安全
- std::函数是否可以序列化
- 检查std::ostream中是否序列化了某些内容