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


C++11里的RTTI更好用了,參見這里:http://en.cppreference.com/w/cpp/types。與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操作符在<typeinfo>中聲明,用來在運行時獲取類型、變量、表達式的類型信息,適用於C++基礎類型、內置類、用戶自定義類、模板類等。

它有兩種形式:

  • typeid( 類型 )
  • typeid( 表達式 )

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

type_index

type_index類在頭文件<typeindex>中聲明,它是type_info對象的一個封裝類,可以用作關聯容器(比如map)和無序關聯容器(比如unordered_map)的索引。

下面的代碼(來自http://en.cppreference.com/w/cpp/types/type_index)使用type_index來輸出一些類型信息(調試還是蠻有用的):

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';
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com