C++运行时获取类型信息的type_info类与bad_typeid异常
type_info类
type_info类描述编译器在程序中生成的类型信息。此类的对象可以有效存储指向类型的名称的指针。type_info类还可存储适合比较两个类型是否相等或比较其排列顺序的编码值。类型的编码规则和排列顺序是未指定的,并且可能因程序而异。
必须包含<typeinfo>标头文件才能使用type_info类。type_info类的接口是:
classtype_info{ public: virtual~type_info(); size_thash_code()const _CRTIMP_PUREbooloperator==(consttype_info&rhs)const; _CRTIMP_PUREbooloperator!=(consttype_info&rhs)const; _CRTIMP_PUREintbefore(consttype_info&rhs)const; _CRTIMP_PUREconstchar*name()const; _CRTIMP_PUREconstchar*raw_name()const; };
您不能直接实例化type_info类的对象,因为该类只有一个私有复制构造函数。构造(临时)type_info对象的唯一方式是使用typeid运算符。由于赋值运算符也是私有的,因此不能复制或分配类type_info的对象。
type_info::hash_code可定义适合将typeinfo类型的值映射到索引值的分布的哈希函数。
运算符==和!=分别用于与其他type_info对象比较是否相等和不相等。
类型的排列顺序与继承关系之间没有关联。使用type_info::before成员函数可确定类型的排序顺序。不能保证type_info::before在不同的程序中(甚至是多次运行同一程序时)会产生相同的结果。这样,type_info::before类似于address-of(&)运算符。
type_info::name成员函数可将constchar*返回到以null结尾的字符串,该字符串表示类型的用户可读名称。将缓存所指向的内存,应该从不直接释放它。
type_info::raw_name成员函数可将constchar*返回到以null结尾的字符串,该字符串表示对象类型的修饰名称。该名称实际上以其修饰的形式存储以节省空间。因此,此函数比type_info::name更快,因为它不需要取消修饰名称。type_info::raw_name函数返回的字符串在比较运算符中很有用,但它不可读。如果您需要用户可读的字符串,请改用type_info::name函数。
bad_typeid异常
当typeid的操作数是Null指针时,typeid运算符将引发bad_typeid异常。
语法
catch(bad_typeid) statement
备注
bad_typeid的接口为:
classbad_typeid:publicexception { public: bad_typeid(constchar*_Message="badtypeid"); bad_typeid(constbad_typeid&); virtual~bad_typeid(); };
以下示例演示引发bad_typeid异常的typeid运算符。
//expre_bad_typeid.cpp //compilewith:/EHsc/GR #include<typeinfo.h> #include<iostream> classA{ public: //objectforclassneedsvtable //forRTTI virtual~A(); }; usingnamespacestd; intmain(){ A*a=NULL; try{ cout<<typeid(*a).name()<<endl;//Errorcondition } catch(bad_typeid){ cout<<"ObjectisNULL"<<endl; } }
输出
ObjectisNULL