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

C++ 模板完全指南:函數模板、類模板、特化、參數推導與現代最佳實踐

     編輯:關於C++

模板是 C++ 泛型編程的基石,實現「編寫一次,適用多類型」的零開銷抽象。本文系統講解函數模板、類模板、非類型參數、模板特化、參數推導規則、別名模板、可變參數模板 (C++11) 及 Concepts (C++20) 等核心知識,並給出工程級編碼規範。

一、 函數模板:泛型算法的標準形式

1. 基本語法與實例化機制

template  // 或 class T
T Max(T a, T b) {
    return (a > b) ? a : b;
}

// 顯式實例化 (指定模板參數)
int n = Max(3, 5);   // 生成 int Max(int, int)
// 隱式實例化 (參數推導)
double d = Max(3.14, 2.71); // 推導 T=double,生成 double Max(double, double)

編譯器為每組具體模板參數生成獨立函數代碼(代碼膨脹風險),類似宏但帶類型檢查、作用域、重載解析。

2. 多模板參數與默認參數

template 
T1 Max(T1 a, T2 b) { return (a > b) ? a : b; }

Max(10, 20);       // T1=int, T2=int
Max(10, 3.14);     // T1=int, T2=double (隱式轉換)
Max(10, 3.14); // T1=double, T2=double (顯式指定 T1,T2 用默認)

3. 函數模板重載與普通函數協調

  • 同名函數模板可重載(參數列表不同)。
  • 普通函數與模板同名時,匹配優先級:精確匹配普通函數 > 模板實例化 > 隱式轉換匹配普通函數。
  • 避免二義性:Max(int, int) 同時有普通版與模板版會報錯。

4. 尾置返回類型與 decltype(auto) (C++14)

template 
auto Add(T a, U b) -> decltype(a + b) { return a + b; } // C++11

template 
decltype(auto) Add(T a, U b) { return a + b; } // C++14 保留引用/const 屬性

二、 類模板:泛型數據結構的骨架

1. 定義與實例化

template 
class Array {
    T data_[N];
public:
    T& operator[](size_t i) { return data_[i]; }
    size_t size() const { return N; }
};

Array arr; // 實例化為具體類型 Array
arr[0] = 42;

2. 成員函數類外定義語法

template 
T& Array::operator[](size_t i) { return data_[i]; } // 必須帶模板參數列表

3. 類模板參數推導 (CTAD, C++17)

std::pair p(1, 3.14);      // 推導 std::pair
std::vector v = {1,2,3};   // 推導 std::vector
Array arr = {1,2,3,4,5};   // 推導 Array (需 C++20 或提供推導向導)

4. 非類型模板參數 (NTTP)

編譯期常量:整型、枚舉、指針/引用 (外部鏈接)、std::nullptr_t、浮點型 (C++20)、字面值類型 (C++20)。

template 
struct Buffer { T data[N]; };

template  // C++17 自動推導類型
struct S { static constexpr auto value = N; };

5. 模板模板參數

template