首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ RTTI 機制:typeid 運算符獲取數據類型信息詳解

     編輯:關於C++

RTTI 簡介

RTTI(Run-Time Type Identification)允許程序在運行時確定對象的實際類型。C++ 提供兩大工具:dynamic_cast(安全向下轉型)與 typeid(獲取類型信息)。

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 可實現類型安全的容器、日誌、序列化等場景。理解其靜態/動態類型區別至關重要。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved