C++:type_info来区分类型

peo*_*oro 19 c++ typeid typeinfo

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

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

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

  2. std::type_info::before必须说,Type1 Type2 异或 Type2之前 Type1.

    // like this:
    typeid(T1).before( typeid(T2) ) != typeid(T2).before( typeid(T1) )
    
    Run Code Online (Sandbox Code Playgroud)
  3. 相同模板类的两种不同的特化被认为是不同的类型.

  4. typedef相同类型的两个不同定义是相同类型.

最后:

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

  • 的速度有多快operator==,operator!=以及before对最常见的编译器?我猜他们应该只比较一个值.速度有多快typeid

  • 我有一个类Avirtual bool operator==( const A& ) const.由于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 ) );
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

小智 8

快速浏览一下文档后,我会说:

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

  2. 引用告诉:"如果类型在整理顺序中位于rhs类型之前,则返回true.归类顺序只是由特定实现保留的内部顺序,并不一定与继承关系或声明顺序相关." 因此,您可以保证在排序顺序中没有类型具有相同的排名.

  3. 模板类的每个实例化都是不同的类型.专业化不例外.

  4. 我真的不明白你的意思.如果你的意思是拥有typedef foo bar;两个独立的编译单元,并且两者中的条形图相同,那么它就是这样的.如果你的意思是typedef foo bar; typedef int bar;,它不起作用(除非foo是int).

关于您的其他问题:

  • 你应该存储对std :: type_info的引用,以某种方式包装它.
  • 绝对不了解性能,我认为即使类型复杂,比较运算符也有恒定的时间.之前必须具有线性复杂性,具体取决于代码中使用的不同类型的数量.
  • 这真是奇怪的imho.你应该重载你的,operator==而不是让它虚拟并覆盖它.

  • 一致的实现可能会为不同类型返回相同的名称。 (2认同)