peo*_*oro 19 c++ typeid typeinfo
我知道编译器在实现std::type_info函数行为方面有很大的自由度.
我正在考虑使用它来比较对象类型,所以我想确定:
std::type_info::name 必须为两种不同类型返回两个不同的字符串.
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)相同模板类的两种不同的特化被认为是不同的类型.
typedef相同类型的两个不同定义是相同类型.
最后:
由于std::type_info不可复制,我怎么能type_info在某处存储(例如:在a中std::map)?唯一的方法是std::type_info总是分配一个地方(例如:在堆栈上或静态/全局变量上)并使用指向它的指针?
的速度有多快operator==,operator!=以及before对最常见的编译器?我猜他们应该只比较一个值.速度有多快typeid?
我有一个类A有virtual 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
快速浏览一下文档后,我会说:
std :: type_info :: name总是返回两个不同类型的两个不同的字符串,否则它意味着编译器在解析类型时丢失了自己,你不应该再使用它了.
引用告诉:"如果类型在整理顺序中位于rhs类型之前,则返回true.归类顺序只是由特定实现保留的内部顺序,并不一定与继承关系或声明顺序相关." 因此,您可以保证在排序顺序中没有类型具有相同的排名.
模板类的每个实例化都是不同的类型.专业化不例外.
我真的不明白你的意思.如果你的意思是拥有typedef foo bar;两个独立的编译单元,并且两者中的条形图相同,那么它就是这样的.如果你的意思是typedef foo bar; typedef int bar;,它不起作用(除非foo是int).
关于您的其他问题:
operator==而不是让它虚拟并覆盖它.