如果有的话,有什么 C++ 结构可以在运行时列出类的祖先?
基本上,我有一个类,它存储指向任何对象的指针,可能包括原始类型(有点像boost::any
,我不想使用它,因为我需要保留对象的所有权)。在内部,这个指针是 a void*
,但这个类的目标是void*
用运行时类型安全包装 。赋值运算符是模板化的,所以在赋值时我获取typeid()
传入指针的 并存储它。然后当我稍后再转换时,我可以检查typeid()
转换类型与存储的type_info
. 如果不匹配,强制转换将引发异常。
但是有一个问题:似乎我失去了多态性。假设B
是D
. 如果我在我的类中存储一个指针D
,那么存储的type_info
也将是D
. 然后稍后,我可能想要检索一个B
指针。如果我使用我的类的方法强制转换为B*
,那么会typeid(B) == typeid(D)
失败,并且强制转换会引发异常,即使D->B
转换是安全的。Dynamic_cast<>()
不适用于这里,因为我在 avoid*
而不是 or 的祖先上B
操作D
。
我想做的是检查is_ancestor(typeid(B), typeid(D))
。这可能吗?(这不是dynamic_cast<>
在幕后做的吗?)
如果没有,那么无论如何我都在考虑采用第二种方法:实现 aa class TypeInfo
,其派生类是模板化的单例。然后我可以在这些类中存储我喜欢的任何信息,然后在我的类中保留指向它们的指针AnyPointer
。这将允许我在编译时以更易于访问的方式生成/存储祖先信息。所以失败的选项#1(一种列出祖先的内置方式,只给出运行时可用的信息),是否有我可以使用的构造/过程,它允许在编译时自动生成和存储祖先信息,最好没有必须明确输入“类A
派生自B
和C
;C
派生自D
“等等?一旦我有了这个,有没有一种安全的方式来实际执行那个演员?