我在RTTI中使用C ++。我有一个type_info
类。如果我只有type_info
,我如何判断另一个类是否是第一个类的子类?
#include <typeinfo>
class Foo { public: virtual ~Foo() {} };
class Boo: public Foo { public: virtual ~Boo() {} };
class Bar { public: virtual ~Bar() {} };
template<class T>
bool instanceOf(const type_info& info) {
// ANSWER COMES HERE!!
}
int main(int argc, const char* argv[]) {
const type_info& fooInfo = typeid(Foo);
const type_info& barInfo = typeid(Bar);
bool booIsFoo = instanceOf<Boo>(fooInfo); // should be true
bool booIsBar = instanceOf<Boo>(barInfo); // should be false
return 0;
}
答案 0 :(得分:4)
如果你只有两个typeinfo A和B.没有通用的方法来确定A是否是B的子类。
你可以:
以前的答案。它们要求您以某种方式实例化类型:
type_info
不是正确的工具,如果你绝对想在运行时检查,你应该dynamic_cast
:
template<class Base, typename Derived>
bool instanceOf(const Derived& object) {
return !dynamic_cast<Base*>(object);
}
您也可以在编译时使用std::is_base_of
进行检查,如Steephen所述(需要C ++ 11)。
template <typename Base, typename Derived>
static constexpr bool instanceOf() {
return std::is_base_of<Base, Derived>()
}
另一种解决方案:
template <typename Base, typename Derived>
bool instanceOf(const Derived& object) {
try {
throw object;
} catch (const Base&) {
return true;
} catch (...) {
return false;
}
}