如何使用 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的子类。
您可以:
- 自己存储这些信息(静态结构在运行时填充?)
- 使用类型名称进行有根据的猜测(即解析类型信息字符串并相应地命名类型)。
以前的答案。他们要求您以某种方式实例化类型:
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++ 与 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的子类。
您可以:
- 自己存储这些信息(静态结构在运行时填充?)
- 使用类型名称进行有根据的猜测(即解析类型信息字符串并相应地命名类型)。
以前的答案。他们要求您以某种方式实例化类型:
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;
}
}