C ++和序列化:有没有办法进行某种内省?

时间:2011-11-15 11:12:02

标签: c++ introspection

我在Wikipedia阅读了一些例子,但我正在寻找一些现实生活中的例子:如何使用内省,为什么(它有助于编写干净的代码)和代码本身。

例如,有没有办法创建一个“通用”函数来序列化任何类型的对象?我的意思是:在父级中只有一个函数,所有后代都可以在文件中“保存”+“恢复”自己。

7 个答案:

答案 0 :(得分:1)

在C ++中有RTTI,你也可以使用条件和dynamic_cast<>()来实现这个效果,但是在C ++中我们通常会尽力在编译时尽力而为。如果您觉得需要内省的机会,那么有更好的方法来实现您的静态方法目标。

答案 1 :(得分:1)

它没有被使用(因为它不存在),没有代码示例(因为它不存在),并且没有理由尝试使用它(因为它不存在)。

最接近的是RTTI / dynamic_cast。但这并不是真正的内省。

答案 2 :(得分:0)

不是真的。你最接近的是RTTI。但请查看Qt metaobjects以了解他们是如何做到的(也使用他们的moc生成器)。

答案 3 :(得分:0)

答案 4 :(得分:0)

答案 5 :(得分:0)

从链接的文章中可以看出,您指的是typeiddynamic_cast<>。您应该在问题中明确说明,因为您很快就会看到很多人会直接跳过而不浏览链接。

现在,他们如何/何时使用?最简单的答案是通常不应该使用它。在大多数情况下,精心设计的程序不需要执行运行时类型检查,如果您发现自己这样做,那么您的设计可能会遇到麻烦。

当然,所有事情都有例外,特别是@Sga给出的例子非常好。在boost::any中,库执行 type-erasure 以便能够在类型中保存任何对象,然后在any_cast中手动使用RTTI提取值以验证实际对象的类型是否正确。现在,这也不常见,大多数程序都不使用 type-erasure ,当它们这样做时,很少需要在运行时分析类型。

答案 6 :(得分:0)

正如其他人之前所说的那样,内省不是C ++的一个特征,而你最接近它的是typeid()和dynamic_cast&lt;&gt;,但你真的不想那么接近。;)

仔细设计所有权,传递和包含引用的系统,使用policy-based design可以用来摆脱这种内省的需要:在严格的OOP世界中,对象不是(应该是)需要知道自己的类型(超出提供virtual行为,其中定义了这样)。