我在Wikipedia阅读了一些例子,但我正在寻找一些现实生活中的例子:如何使用内省,为什么(它有助于编写干净的代码)和代码本身。
例如,有没有办法创建一个“通用”函数来序列化任何类型的对象?我的意思是:在父级中只有一个函数,所有后代都可以在文件中“保存”+“恢复”自己。
答案 0 :(得分:1)
在C ++中有RTTI,你也可以使用条件和dynamic_cast<>()
来实现这个效果,但是在C ++中我们通常会尽力在编译时尽力而为。如果您觉得需要内省的机会,那么有更好的方法来实现您的静态方法目标。
答案 1 :(得分:1)
它没有被使用(因为它不存在),没有代码示例(因为它不存在),并且没有理由尝试使用它(因为它不存在)。
最接近的是RTTI / dynamic_cast
。但这并不是真正的内省。
答案 2 :(得分:0)
不是真的。你最接近的是RTTI。但请查看Qt metaobjects以了解他们是如何做到的(也使用他们的moc
生成器)。
答案 3 :(得分:0)
我建议你研究 boost :: any
答案 4 :(得分:0)
对于C ++,如果必须“去那里”,则有RTTI
答案 5 :(得分:0)
从链接的文章中可以看出,您指的是typeid
和dynamic_cast<>
。您应该在问题中明确说明,因为您很快就会看到很多人会直接跳过而不浏览链接。
现在,他们如何/何时使用?最简单的答案是通常不应该使用它。在大多数情况下,精心设计的程序不需要执行运行时类型检查,如果您发现自己这样做,那么您的设计可能会遇到麻烦。
当然,所有事情都有例外,特别是@Sga给出的例子非常好。在boost::any
中,库执行 type-erasure 以便能够在类型中保存任何对象,然后在any_cast
中手动使用RTTI提取值以验证实际对象的类型是否正确。现在,这也不常见,大多数程序都不使用 type-erasure ,当它们这样做时,很少需要在运行时分析类型。
答案 6 :(得分:0)
正如其他人之前所说的那样,内省不是C ++的一个特征,而你最接近它的是typeid()和dynamic_cast&lt;&gt;,但你真的不想那么接近。;)
仔细设计所有权,传递和包含引用的系统,使用policy-based design可以用来摆脱这种内省的需要:在严格的OOP世界中,对象不是(应该是)需要知道自己的类型(超出提供virtual
行为,其中定义了这样)。