RTTI(Run-Time Type Identification)允許程序在運行時確定對象的實際類型。C++ 提供兩大工具:dynamic_cast(安全向下轉型)與 typeid(獲取類型信息)。
typeid(expr) 返回 const std::type_info&,可獲取類型名稱、比較類型等價性。type_info::name() 返回實現定義的類型字符串(如 GCC 下 int 為 "i",MSVC 下為 "int")。
#include <iostream>
#include <typeinfo>
#include <string>
using namespace std;
struct Node { int id; Node* next; };
template <typename T>
T add(T a, T b) {
cout << typeid(T).name() << ' '; // 輸出模板實參類型
return a + b;
}
int main() {
// 內置類型
int a = 3; double b = 1.5;
cout << typeid(a).name() << ' ' << typeid(b).name() << '\n';
// 指標類型
int* p = &a;
cout << typeid(p).name() << ' ' << typeid(*p).name() << '\n';
// 引用類型
const int& ref = a;
cout << typeid(ref).name() << '\n';
// 自定義類型
Node nd;
cout << typeid(nd).name() << '\n';
// 多態類型(需虛函數)
// typeid(*base_ptr) 返回動態類型
// 模板函數演示
add(1, 2); // int
add(1.0, 2.0); // double
add(string("a"), string("b")); // std::string
return 0;
}
typeid 不會執行表達式(如 typeid(func()) 不調用 func)。typeid(*ptr) 返回動態類型;否則返回靜態類型。type_info::name() 僅供調試,不可攜帶跨編譯器比較。<typeinfo>,部分編譯器需開啟 RTTI 選項(如 -frtti)。typeid 是輕量級運行時類型查詢工具,配合 type_info 可實現類型安全的容器、日誌、序列化等場景。理解其靜態/動態類型區別至關重要。