我知道编译器在实现 std::type_info
函数的行为方面有很大的自由度。
我正在考虑使用它来比较对象类型,所以我想确定:
std::type_info::name
必须为两种不同的类型返回两个不同的字符串。std::type_info::before
必须说Type1
是 beforeType2
exclusive-orType2
是 beforeType1
。// like this: typeid(T1).before( typeid(T2) ) != typeid(T2).before( typeid(T1) )
同一模板类的两种不同的特化被认为是不同的类型。
同一类型的两个不同的
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 ) ); }
这是实现此类运算符的可接受(和标准)方式吗?
最佳答案
快速浏览文档后,我想说:
std::type_info::name 总是为两种不同的类型返回两个不同的字符串,否则意味着编译器在解析类型时会丢失自己,你不应该再使用它了。
Reference 告诉:“如果类型在排序规则中 rhs 的类型之前,则返回 true。排序规则只是特定实现保持的内部顺序,不一定与继承关系或声明顺序相关。” 因此,您可以保证没有任何类型在排序顺序中具有相同的排名。
模板类的每个实例化都是不同的类型。特化也不异常(exception)。
我不太明白你的意思。如果您的意思是在两个单独的编译单元中具有
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/