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

模板元編程技巧:編譯期類型判斷與靜態分發

     編輯:關於C

核心思想

利用模板特化在編譯期將類型映射為整數常量,實現靜態分發,零運行時開銷。

類型檢查器模板

template <typename T>
class TypeChecker; // 主模板故意不定義,觸發編譯錯誤

template <>
class TypeChecker<std::string> {
public:
    static const int TYPE = 1;
};

template <>
class TypeChecker<const char*> {
public:
    static const int TYPE = 2;
};

template <>
class TypeChecker<char*> {
public:
    static const int TYPE = 3;
};

使用示例

int main() {
    std::string dummy = "";
    if (TypeChecker<typeof(dummy)>::TYPE == 1)
        std::cout << "std::string" << std::endl;

    char* data = "";
    if (TypeChecker<typeof(data)>::TYPE == 3)
        std::cout << "char*" << std::endl;
}

原理解析

  • 編譯器根據實際類型選擇對應特化版本
  • static const int 為編譯期常量,優化器可直接內聯
  • 若類型無對應特化,主模板未定義導致編譯失敗,達到靜態斷言效果

現代 C++ 替代

C++17 起可用 if constexpr + std::is_same_v 簡化:

if constexpr (std::is_same_v<T, std::string>) { ... }
else if constexpr (std::is_same_v<T, const char*>) { ... }

但特化模板仍適用於需輸出類型相關常量、構建 traits 體系等場景。

摘自 無心雲

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