Typeid操作符
获得对象运行时信息的另一种方法是使用typeid 操作符。这个操作符返回type_info类对象,
type_info产生应用类对象的信息。如果类型是多态的,他就给出关于大多衍生类型(动态类型)应用的信息;否则他就产生静态类型信息。Typeid操作符使用方法之一是得到一个被当作const char*对象的动态类型名字,正如你在下面的例子中所看到的:
//: C08:TypeInfo.cpp
// Illustrates the typeid operator.
#include <iostream>
#include <typeinfo>
using namespace std;
struct PolyBase { virtual ~PolyBase() {} };
struct PolyDer : PolyBase { PolyDer() {} };
struct NonPolyBase {};
struct NonPolyDer : NonPolyBase { NonPolyDer(int) {} };
int main() {
// Test polymorphic Types
const PolyDer pd;
const PolyBase* ppb = &pd;
cout << typeid(ppb).name() << endl;
cout << typeid(*ppb).name() << endl;
cout << boolalpha << (typeid(*ppb) == typeid(pd))
<< endl;
cout << (typeid(PolyDer) == typeid(const PolyDer))
<< endl;
// Test non-polymorphic Types
const NonPolyDer npd(1);
const NonPolyBase* nppb = &npd;
cout << typeid(nppb).name() << endl;
cout << typeid(*nppb).name() << endl;
cout << (typeid(*nppb) == typeid(npd)) << endl;
// Test a built-in type
int i;
cout << typeid(i).name() << endl;
} ///:~
使用一种特定编译器上面例子的输出是
struct PolyBase const *
struct PolyDer
true
true
struct NonPolyBase const *
struct NonPolyBase
false
int
输出的第一行正好反映了ppb的静态类型因为它是一个指针。为了得到RTTI(To get RTTI to kick in),你需要注意指针或引用的目的对象,它是在第二行阐述的。注意RTTI忽略顶层的const 和 volatile限定符。由于不是多态类型(With non-polymorphic types),你只能得到静态类型(指针本身的类型)。正如你所看到的,也支持内建类型。
他表明你不能在一个type_info对象里存放typeid操作符的结果,因为这里没有可访问的构造函数以及不接受赋值。你必须象我们展示的那样用它。另外,由type_info::name( )返回的实际字符串对编译器是有依赖的。例如,对一个较C的类,一些编译器返回class C而不是正好是C。对一个解除参照的null指针表达式应用typeid会引发一个bad_typeid 异常被抛出。
下面的例子表明type_info::name( )返回的类名字是被完全限定的。
//: C08:RTTIandNesting.cpp
#include <iostream>
#include <typeinfo>
using namespace std;
class One {
class Nested {};
Nested* n;
public:
One() : n(new Nested) {}
~One() { delete n; }
Nested* nested() { return n; }
};
int main() {
One o;
cout << typeid(*o.nested()).name() << endl;
} ///:~
因为Nested是one类的一个成员的类型,结果就是One::Nested。
你也可以用before(type_info&),查询一个type_info对象如果在实际定义的整理序列里它在另一个type_info对象之前。它返回true或false。如果你说:
if(typeid(me).before(typeid(you))) // ...
你是在问在现在的整理序列里me是否在you之前发生。如果你把type_info对象作为关键字使用这是有用的。
本文地址:http://com.8s8s.com/it/it1052.htm