Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用type\u info判断类型是否为子类? 我用C++和RTTI。我有一个类的类型信息。如果我只有类型信息,我如何判断另一个类是否是第一个类的子类_C++_Rtti - Fatal编程技术网

如何使用type\u info判断类型是否为子类? 我用C++和RTTI。我有一个类的类型信息。如果我只有类型信息,我如何判断另一个类是否是第一个类的子类

如何使用type\u info判断类型是否为子类? 我用C++和RTTI。我有一个类的类型信息。如果我只有类型信息,我如何判断另一个类是否是第一个类的子类,c++,rtti,C++,Rtti,如果您只有两个typeinfo A和B,那么没有通用的方法来确定A是否是B的子类 你可以: 自己存储这些信息运行时填充的静态结构? 使用类型名称进行有根据的猜测,即解析类型信息字符串并相应地命名类型。 以前的答案。它们要求您以某种方式实例化类型: type_info不是用于此目的的合适工具,如果您绝对希望在运行时检查,则应使用dynamic_cast: template<class Base, typename Derived> bool instanceOf(const Deriv

如果您只有两个typeinfo A和B,那么没有通用的方法来确定A是否是B的子类

你可以:

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

type_info不是用于此目的的合适工具,如果您绝对希望在运行时检查,则应使用dynamic_cast:

template<class Base, typename Derived>
bool instanceOf(const Derived& object) {
  return !dynamic_cast<Base*>(object);
}
另一个解决方案:

template <typename Base, typename Derived>
bool instanceOf(const Derived& object) {
  try {
      throw object;
  } catch (const Base&) {
      return true;
  } catch (...) {
      return false;
  }
}

是否有任何理由避免std::Is_base_of?是否必须使用type_info?这不能通过测试强制转换的结果来完成吗?我想存储类型\u信息,稍后测试继承。std::is_base_of and dynamic_cast需要将类型作为模板参数,我无法将其存储以供以后使用。在拥有对象并存储布尔值时进行检查似乎非常简单:此外,您还可以保留一个指向对象的指针,以其他方式推迟测试。这个答案可以帮助您:返回!谢谢,但是这些解决方案要求我将超类指定为模板参数,所以它在编译时可用。但是,我想针对我确定并存储运行时的类型测试继承。这就是我需要type_info的原因。typeinfo仅仅是一个字符串,它本身不包含任何关系信息,因此您需要依赖其他一些附加机制。编辑:修正了评论谢谢,这解释了为什么这种方式不太可能我希望它包含更多的信息,而不仅仅是一个简单的字符串。我相应地更新了答案。这是不可能的直接,但当然,如果您手动存储类型之间的关系,您应该能够以某种方式实现您想要的。。。
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;
  }
}