typeid能獲取類型名稱、判斷類型是否相同以及獲取哈希值。1.通過.name()方法獲取類型名,但可讀性差;2.用==或!=比較類型;3.調用.hash_code()獲取唯一標識符。在多態場景下,作用于對象指針時需使用obj形式才能識別實際類型,如對base obj指向的derived對象,typeid(*obj)返回derived類型信息。使用時需注意:空指針解引用拋出std::bad_typeid異常;僅多態類支持動態識別;類型名輸出依賴編譯器,建議自定義映射表。常見用途包括:判斷類型一致性、結合異常處理防錯、調試輸出及輔助實現反射和安全轉換檢查。
在c++中,typeid 是一個操作符,用來在運行時獲取對象或類型的類型信息。它屬于RTTI(Run-Time Type Information)機制的一部分,常用于多態類型識別、調試輸出等場景。
typeid 能獲取哪些信息?
typeid 返回的是一個 std::type_info 類型的對象,這個對象包含了當前類型的一些基本信息:
- 類型名稱:通過 .name() 方法可以獲取類型名,但通常不是可讀性很強的字符串(比如可能是編譯器內部的編碼形式)。
- 類型是否相同:可以用 == 或 != 來判斷兩個 typeid 是否代表同一個類型。
- 哈希值:可以通過 .hash_code() 獲取該類型的唯一標識符,可用于容器中作為鍵值使用。
舉個簡單例子:
立即學習“C++免費學習筆記(深入)”;
int a; std::cout << typeid(a).name() << std::endl; // 輸出類似 i(表示int)
需要注意的是,如果你傳入的是一個變量而不是類型名本身,那會根據實際類型返回信息,特別是對多態類來說非常有用。
在多態場景下怎么用?
當作用于一個多態類(有虛函數的類)的對象時,typeid 可以識別出對象的真實類型,而不僅僅是聲明時的指針/引用類型。
例如:
class Base { public: virtual void foo() {} }; class Derived : public Base {}; Base* obj = new Derived(); std::cout << typeid(obj).name() << std::endl; // 輸出 P4Base(Base* 類型) std::cout << typeid(*obj).name() << std::endl; // 輸出 7Derived(實際是 Derived 對象)
可以看到,typeid(obj) 是指針類型,而 typeid(*obj) 才真正體現了多態特性下的動態類型識別能力。
使用注意事項
- 如果你嘗試對空指針進行 typeid(*ptr) 操作,會導致拋出 std::bad_typeid 異常。
- 并非所有類型都能正確使用 RTTI,只有帶有虛函數的類才支持運行時類型識別。
- typeid.name() 的輸出因編譯器而異,不能依賴其可讀性,如果需要更清晰的類型名,建議自己維護映射表。
一些常見做法包括:
-
判斷兩個對象是否是同一類型:
if (typeid(a) == typeid(b)) { ... }
-
結合異常處理使用,防止空指針訪問:
try { std::cout << typeid(*ptr).name(); } catch (std::bad_typeid& e) { std::cout << "Pointer is null!" << std::endl; }
實際用途舉例
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END