我知道编译器在实现std::type_info
函数的行为方面有很大的自由度。
我正在考虑使用它来比较对象类型,所以我想确保:
std::type_info::name
必须为两个不同的types.std::type_info::before
返回两个不同的字符串必须说明Type1
在Type2
exclusive之前-或者 Type2
在Type1
之前。//像这样: 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
中的虚拟操作符:虚拟bool operator==( const A &other ) const { if( typeid(*this) != typeid( other ) ) return false;//为任何B类定义B::operator==( const B &other ) const //返回operator==( static_cast( Other) );}
这是一种可接受的(和标准的)实现这种运算符的方式吗?
发布于 2010-11-16 13:04:42
在快速浏览文档之后,我会说:
对于两个不同的类型,
typedef foo bar;
放在两个单独的编译单元中,而这两个编译单元中的栏是相同的,那么它就是这样工作的。如果你指的是typedef foo bar; typedef int bar;
,它就不能工作(除非foo是int)。关于你的其他问题:
你应该存储对std::type_info的引用,或者包装它,而不考虑性能,我假设比较运算符有恒定的时间,尽管类型复杂。之前必须有线性复杂度,这取决于你的代码中使用的不同类型的数量。,
operator==
,而不是将其设置为虚拟并覆盖它。发布于 2010-11-16 12:48:36
标准18.5.1 (type_info类):
类type_info描述由实现生成的类型信息。此类的对象有效地存储了一个指向类型名称的指针,以及一个适合比较两种类型是否相等或排序顺序的编码值。类型的名称、编码规则和排序顺序都是未指定的,在不同的程序中可能会有所不同。
据我所知:
,
std:type_info::name
的保证。这个标准只说明了behavior.name
,我相信一个符合标准的实现可以为每个类型返回相同的字符串。name
’for me关于第二组问题:
type_info
。Andrei Alexandrescu在其Modern C++ Design一书中提出了一个TypeInfo
包装器。请注意,由typeid
返回的对象具有静态存储,因此您可以安全地存储指针,而无需担心对象的生存期type_info
比较非常有效(实际上没有太多可比较的内容)。发布于 2010-11-16 12:51:48
您可以像这样存储它。
class my_type_info
{
public:
my_type_info(const std::type_info& info) : info_(&info){}
std::type_info get() const { return *info_;}
private:
const std::type_info* info_;
};
编辑:
C++标准5.2.8。
类型表达式的结果是静态类型const std::type_info的左值...
这意味着你可以像这样使用它。
my_type_info(typeid(my_type));
typeid函数返回一个左值(它不是临时的),因此返回的type_info的地址总是有效的。
https://stackoverflow.com/questions/4194191
复制相似问题