thinking in c++卷2

类别:VC语言 点击:0 评论:0 推荐:

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