1. 程式人生 > >C++11 | 執行時型別識別(RTTI)

C++11 | 執行時型別識別(RTTI)

  • type_info類
  • typeid操作符
  • type_index類

type_info

type_info類在標頭檔案<typeinfo>中定義,代表了一個C++型別的相關資訊。一般由typeid操作符返回,不能自己構造。

type_info是實現相關的,不同編譯工具鏈的實現可能不一致。

下面的程式碼可以打印出int型別的名字:

const std::type_info &tiInt = typeid(int);
std::cout << "tiInt.name = " << tiInt.name() << std::endl;

type_info有下列方法:

  • name(),返回型別的名字
  • hash_code(),返回這個型別的雜湊值(具有唯一性)
  • before(),可以判斷一個type_info物件的順序是否在另一個之前(實現相關,同一個程式多次呼叫都可能不一樣,不太理解有什麼實際作用)
  • ==和!=操作符,判斷兩個type_info相等或不等

typeid操作符

typeid操作符在中宣告,用來在執行時獲取型別、變數、表示式的型別資訊,適用於C++基礎型別、內建類、使用者自定義類、模板類等。

它有兩種形式:

  • typeid( 型別 )
  • typeid( 表示式 )

具體用法前面的示例程式碼已有了。

type_index

type_index類在標頭檔案<typeindex>

中宣告,它是type_info物件的一個封裝類,可以用作關聯容器(比如map)和無序關聯容器(比如unordered_map)的索引。

struct A {
    virtual ~A() {}
};

struct B : A {};
struct C : A {};

int main()
{
    std::unordered_map<std::type_index, std::string> type_names;

    type_names[std::type_index(typeid(int))] = "int";
    type_names[std::type_index(typeid(double))] = "double";
    type_names[std::type_index(typeid(A))] = "A";
    type_names[std::type_index(typeid(B))] = "B";
    type_names[std::type_index(typeid(C))] = "C";

    int i;
    double d;
    A a;

    // note that we're storing pointer to type A
    std::unique_ptr<A> b(new B);
    std::unique_ptr<A> c(new C);

    std::cout << "i is " << type_names[std::type_index(typeid(i))] << '\n';
    std::cout << "d is " << type_names[std::type_index(typeid(d))] << '\n';
    std::cout << "a is " << type_names[std::type_index(typeid(a))] << '\n';
    std::cout << "b is " << type_names[std::type_index(typeid(*b))] << '\n';
    std::cout << "c is " << type_names[std::type_index(typeid(*c))] << '\n';
}