如何使用type_info判断类型是否为子类?

时间:2015-07-09 00:24:45

标签: c++ rtti

我在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;
}

1 个答案:

答案 0 :(得分:4)

如果你只有两个typeinfo A和B.没有通用的方法来确定A是否是B的子类。

你可以:

  1. 自己存储此信息(在运行时填充静态结构?)
  2. 使用类型名称进行有根据的猜测(即解析类型信息字符串并相应地命名类型)。
  3. 以前的答案。它们要求您以某种方式实例化类型:

    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;
      }
    }