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

How to tell if a type is a subclass using type_info?

我将 C++ 与 RTTI 结合使用。我有一个 type_info 个 class。如果我只有 type_info,我如何判断另一个 class 是否是第一个的子 class?

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

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

您可以:

  1. 自己存储这些信息(静态结构在运行时填充?)
  2. 使用类型名称进行有根据的猜测(即解析类型信息字符串并相应地命名类型)。

以前的答案。他们要求您以某种方式实例化类型:

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