C++11 | 執行時型別識別(RTTI)
阿新 • • 發佈:2018-12-21
- 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>
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'; }