c++和序列化:有没有办法做某种自省?
C++ and serialization: is there any way to do some kind of introspection?
我在维基百科上读过一些例子,但我正在寻找一些现实生活中的例子:如何使用内省,为什么(它有助于编写干净的代码)和代码本身。
例如,是否有一种方法可以创建一个"泛型"函数来序列化任何类型的对象?我的意思是:只有一个父函数,所有的后代可以"保存"+"恢复"自己到/从一个文件。没有使用它(因为它不存在),没有代码示例(因为它不存在),也没有理由尝试使用它(因为它不存在)。
最接近的是RTTI/dynamic_cast
。但这并不是真正的自省
c++中有RTTI,你也可以使用条件和dynamic_cast<>()
来达到这个效果,但在c++中,我们通常在编译时尽可能多地做。如果您觉得需要自省,那么有可能有更好的(tm)方法来实现静态方法的目标。
不完全是。最接近的是RTTI。但是看看Qt元对象,看看他们是如何做到的(也使用他们的moc
生成器)。
我建议您查看boost::any
http://www.boost.org/doc/libs/1_47_0/doc/html/any.html对于c++来说,如果你必须"去那里",有RTTI
维基百科上有更详细的例子
这个话题已经有了广泛的讨论可供参考
从链接的文章中可以看出,您指的是typeid
和dynamic_cast<>
。你应该在问题中明确这一点,因为你很快就会看到许多人直接跳过链接而不浏览。
现在,它们是如何/何时使用的?最简单的答案是,这通常不应该被使用。在大多数情况下,一个设计良好的程序不需要执行运行时类型检查,如果你发现自己这样做了,那么很可能你的设计出了问题。
当然凡事都有例外,尤其是@Sga给出的例子是一个非常好的例子。在boost::any
中,库执行类型擦除,以便能够在类型中保存任何对象,然后在any_cast
中,它在提取值时手动使用RTTI来验证实际对象的类型是否正确。现在,这也不常见,大多数程序不使用类型擦除,当它们使用时,很少需要在运行时分析类型。
正如其他人之前所说,内省不是c++的特性,您可以获得的最接近它的是typeid()和dynamic_cast<>,但您不会真的想要如此接近。;)
仔细设计所有权系统,传递和包含引用,利用基于策略的设计可以用来摆脱对自省的需要:在严格的OOP世界中,对象不(应该)需要知道它们自己的类型(除了提供virtual
行为,在定义的地方)。
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 如何反序列化数组?
- 如何使用提升序列化?
- 序列化多晶型接口
- c++和序列化:有没有办法做某种自省?