gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:20 24 4
gpt4 key购买 nike

我将 C++ 与 RTTI 结合使用。我有一个类的 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;
}

最佳答案

如果你只有两个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;
}
}

关于c++ - 如何使用 type_info 判断一个类型是否是子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31306121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com