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

C++ 模板完全指南:從函數模板到類模板的泛型編程精髓

     編輯:關於C++

為什麼需要模板?

重載函數雖能處理多類型,但每增加一種類型就要寫一個版本,且無法覆蓋未預料的類型(如用戶自定義類)。模板實現「類型參數化」,一份代碼服務所有符合要求的類型,實現真正的代碼復用。

函數模板語法與實例化


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

// 調用時編譯器自動推導 T
max(3, 5);       // T -> int
max(2.5, 3.1);   // T -> double
max('a', 'z');   // T -> char

編譯器根據實參類型「實例化」出具體函數,如 int max(int,int)、double max(double,double) 等。

類模板設計模式


template 
class Compare {
    T x, y;
public:
    Compare(T a, T b) : x(a), y(b) {}
    T max() { return x > y ? x : y; }
    T min() { return x < y ? x : y; }
};

// 使用:指定具體類型
Compare c1(3, 7);
Compare c2(1.5, 2.6);
Compare c3('a', 'Z');

類模板成員函數類外定義


template 
class Pair {
    T1 first; T2 second;
public:
    Pair(T1 a, T2 b);
    void swap();
};

template 
Pair::Pair(T1 a, T2 b) : first(a), second(b) {}

template 
void Pair::swap() {
    T1 tmp = first; first = second; second = tmp; // 需 T1,T2 可賦值
}

進階特性速覽

  • 非類型模板參數:template class Array { T data[N]; };
  • 模板特化:為特定類型提供專用實現(如 template<> class Compare)。
  • 可變參數模板 (C++11):template void print(Args... args);
  • SFINAE 與 concepts (C++20):約束模板參數滿足特定要求。

常見陷阱與最佳實踐

  1. 模板定義必須在頭文件中(或显式實例化),否則鏈接錯誤。
  2. 避免在模板中使用未限定的名字(依賴參數的名字需加 this-> 或 typename)。
  3. 優先使用 typename 而非 class,語義更清晰。
  4. 善用 std::enable_if / concepts 給出友好錯誤信息。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved