17.1.2 typeinfo类和typeid操作符

    在头文件typeinfo中还定义了typeinfo类和typeid操作符,从typeid的字面即可看出,该操作符用以返回类的id,即类型信息,其基本调用格式如下所示。


    typeinfo&typeid(expr);

    参数expr可以是单个对象,也可以是以返回结果为对象的表达式,还可以是类名,typeid返回一个typeinfo对象的引用,如果expr是类对象(或类名)且至少包含有一个虚函数,typeid操作符返回的typeinfo对象需要在运行时计算,否则,返回一个静态对象,在编译时就可以计算得到。

    typeinfo类中包含了一个name()成员,返回一个字符串,通常是类名。例如下述语句返回的均为静态typeinfo对象。


    cout<<"typeid(5).name()"<<endl;//输出字符串"int" cout<<"typeid(double).name()"<<endl;//输出字符串"double"来看一个返回动态typeinfo对象的例子,如下所示。 class A{……};//包含虚函数 class B:pulic A{……} A*pa=new B; cout<<typeid(*pa).name()<<endl;

    输出结果为"B",换言之,编译器无法根据指针pa的类型在编译阶段对typeid(*id)的输出结果进行判断,必须等到运行时才能计算其返回值。

    typeinfo类中对==和!=进行了重载,因此,可以使用typeid来判断某个变量是否是某种类型,如下所示。


    if(typeid(double)==typeid(x))

    上述代码即用以判断变量x是否是double类型。

    注意

    使用typeid操作符和typeinfo类时,不要忘记包含头文件typeinfo。