C++:type_info 区分类型

标签 c++ typeid typeinfo

我知道编译器在实现 std::type_info 函数的行为方面有很大的自由度。

我正在考虑使用它来比较对象类型,所以我想确定:

  1. std::type_info::name 必须为两种不同的类型返回两个不同的字符串。

  2. std::type_info::before 必须说 Type1before Type2 exclusive-or Type2before Type1

    // like this:
    typeid(T1).before( typeid(T2) ) != typeid(T2).before( typeid(T1) )
    
  3. 同一模板类的两种不同的特化被认为是不同的类型。

  4. 同一类型的两个不同的typedef-initions是同一类型。

最后:

  • 由于 std::type_info 不可复制,我如何将 type_info 存储在某处(例如:在 std::map)? std::type_info 总是分配在某个地方(例如:在堆栈上或在静态/全局变量上)并使用指向它的指针的唯一方法?

  • operator==operator!=before 在大多数常见编译器上的速度有多快?我猜他们应该只比较一个值。 typeid 有多快?

  • 我有一个带有 virtual bool operator==(const A&) const 的类 A。由于 A 有很多子类(其中一些在编译时是未知的),我会以这种方式在任何子类 B 中重载该虚拟运算符:

    virtual bool operator==( const A &other ) const {
      if( typeid(*this) != typeid(other) ) return false;
      // bool B::operator==( const B &other ) const // is defined for any class B
      return operator==( static_cast<B&>( other ) );
    }
    

    这是实现此类运算符的可接受(和标准)方式吗?

最佳答案

快速浏览文档后,我想说:

  1. std::type_info::name 总是为两种不同的类型返回两个不同的字符串,否则意味着编译器在解析类型时会丢失自己,你不应该再使用它了。

  2. Reference 告诉:“如果类型在排序规则中 rhs 的类型之前,则返回 true。排序规则只是特定实现保持的内部顺序,不一定与继承关系或声明顺序相关。” 因此,您可以保证没有任何类型在排序顺序中具有相同的排名。

  3. 模板类的每个实例化都是不同的类型。特化也不异常(exception)。

  4. 我不太明白你的意思。如果您的意思是在两个单独的编译单元中具有 typedef foo bar; 并且该 bar 在两个编译单元中是相同的,那么它就是这样工作的。如果你的意思是 typedef foo bar; typedef int bar;,它不起作用(除非 foo 是 int)。

关于您的其他问题:

  • 您应该存储对 std::type_info 的引用,或者以某种方式包装它。
  • 完全不了解性能,我假设比较运算符具有恒定的时间,尽管类型复杂。 Before 必须具有线性复杂度,具体取决于代码中使用的不同类型的数量。
  • 恕我直言,这真的很奇怪。您应该重载您的 operator== 而不是使其成为虚拟并覆盖它。

关于C++:type_info 区分类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4194191/

相关文章:

c++ - 通过成员访问表达式调用虚函数

c++ - cin.getline() 跳过

c++ - 为什么在具有引用字段的类中隐式删除复制运算符?

delphi - 如何从TGUID获取接口(interface)类型信息?

c++ - type_info是如何实现的

c++ - C++ 类中的循环依赖

c++ - 在 C++ 中获取类实例的名称?

c++ - 在 C++ 中利用 RTTI 的实际用途

c++ - 从 type_id_with_cv<>()::pretty_name() 移除命名空间

C++:如何区分对类成员的引用和对普通变量的引用?