RTTI


RTTI 全名为 Run-Time Type Information,也有人写作 Run-Time Type Identification,代表着执行时期获取对象的类型信息,在 C++ 中,可以使用定义于type_infotypeid来实现。

typeid接受对象,返回type_info实例,具有以下的方法可以操作:

  • before:以 C++ 实现品定义的顺序进行两个类型的顺序比较(这个顺序与继承顺序无关)。
  • hash_code:类型的散列值,相同类型会有相同的散列值。
  • name:返回 C++ 实现品定义的名称。

来看个简单范例:

#include <iostream> 
#include <typeinfo> 
using namespace std; 

class Base { 
public: 
    virtual void foo() { 
        cout << "foo" << endl; 
    } 
}; 

class Derived1 : public Base { 
}; 

class Derived2 : public Base { 
}; 

void printTypeInfo(Base *base) {
    const type_info &info = typeid(*base);
    cout << info.name()      << "\t"
         << info.hash_code() << endl;     
}

int main() { 
    Derived1 *derived1 = new Derived1();
    Derived2 *derived2 = new Derived2();

    printTypeInfo(derived1);
    printTypeInfo(derived2);

    return 0;
}

执行结果如下:

8Derived1       2830024626
8Derived2       3384147286

如果你需要基于类型来排序,type_infobefore方法,是唯一提供顺序的方式,可用来定义比较器(comparator)。例如:

#include <iostream> 
#include <typeinfo> 
#include <vector>
#include <algorithm>
using namespace std; 

class Base { 
public: 
    virtual void foo() { 
        cout << "foo" << endl; 
    } 
}; 

class Derived1 : public Base { 
}; 

class Derived2 : public Base { 
}; 

int main() { 
    Derived1 *derived1 = new Derived1();
    Derived2 *derived2 = new Derived2();

    vector<const type_info*> types = {&typeid(derived1), &typeid(derived2)}; 

    sort(
        types.begin(), types.end(), 
        [](const type_info* a, const type_info* b) { return a->before(*b); }
    );

    for_each(
        types.begin(), types.end() , 
        [](const type_info* t) { cout << (*t).name() << endl; }
    );

    return 0;
}




展开阅读全文