typeid运算符
typeid( type-id )
typeid( expression )
备注
typeid 使用运算符对象的类型将确定运行时。
typeid 的结果是 const type_info 。 该值是对表示 类型 ID 或 表达式的类型, typeid 的窗体使用的 type_info 对象。 请参见 type_info 类 有关更多信息。
typeid 运算符不与托管类型一起使用 (抽象声明或实例),请参见 typeid 有关获取特定类型的 Type 的信息。
typeid 运算符执行运行时检查,在对多态类类型的左值时,对象的实际类型不能依赖于所提供的静态信息。 这类情况是:
对类的引用
指针,取消引用与 *
一 subscripted 指针 (即。 [ ]). (请注意用于指针的一个下标到多态类型。) 通常是不安全的。
如果 表达式 指向基类类型,,对象实际上是从该基类派生的类型, type_info 为派生类的引用是结果。 该 表达式 必须指向多态类型 (处理虚函数的类)。 否则,结果是该 表达式引用的静态类的 type_info 。 此外,它指向必须取消引用的指针,以便使用对象。 未取消引用指针,则结果将是指针的 type_info ,不将指向。 例如:
// expre_typeid_Operator.cpp
// compile with: /GR /EHsc
#include <iostream>
#include <typeinfo.h>
class Base {
public:
virtual void vvfunc() {}
};
class Derived : public Base {};
using namespace std;
int main() {
Derived* pd = new Derived;
Base* pb = pd;
cout << typeid( pb ).name() << endl; //prints "class Base *"
cout << typeid( *pb ).name() << endl; //prints "class Derived"
cout << typeid( pd ).name() << endl; //prints "class Derived *"
cout << typeid( *pd ).name() << endl; //prints "class Derived"
delete pd;
}
如果 表达式 取消引用指针,因此,该指针的值为零, typeid 引发 bad_typeid 异常。 如果指针不指向有效的对象, __non_rtti_object 引发异常,指示尝试分析触发错误的 RTTI (如访问冲突),,因为对象是以某种方式无效 (无效指针或代码不是用 /GR)。
如果 表达式 不是指针和对对象的基类,则结果是 type_info 引用表示形式 表达式。 ,当在编译时已知, 静态 表达式引用表达式的类型。 静态类型,在计算表达式时,执行语义被忽略。 此外,引用将被忽略,如果可能,在确定静态表达式时:
// expre_typeid_Operator_2.cpp
#include <typeinfo>
int main()
{
typeid(int) == typeid(int&); // evaluates to true
}
typeid 还可用于模板确定模板参数的类型:
// expre_typeid_Operator_3.cpp
// compile with: /c
#include <typeinfo>
template < typename T >
T max( T arg1, T arg2 ) {
cout << typeid( T ).name() << "s compared." << endl;
return ( arg1 > arg2 ? arg1 : arg2 );
}