什么是模板?
模板(Template)是 C++ 中實現泛型編程的核心工具。它允許我們編寫與具體數據類型無關的代碼,從而實現代碼復用和類型安全。
為什么需要模板?
舉個生活中的例子:
如果你要造一個能裝水的杯子,你會設計一個通用的模具(模板),而不是為每一種液體(水、果汁、牛奶)都造一個杯子。
C++ 模板就是這個“模具”——它能根據不同的類型生成不同的“杯子”(函數或類)。
一、函數模板(Function Template)
template <typename T>
返回類型 函數名(參數列表) {// 函數體
}
template:聲明這是一個模板。
typename T:定義一個模板參數(T 可以是任意類型)。(class也可以)
#include <iostream>
using namespace std;// 函數模板:加法
template <typename T>
T Add(T a, T b) {return a + b;
}int main() {cout << Add(3, 5) << endl; // int 類型cout << Add(3.14, 2.5) << endl; // double 類型cout << Add('A', 'B') << endl; // char 類型return 0;
}
Add 函數能處理 int、double、char 等類型。
優點:避免為每種類型寫重復函數!
注意事項
模板參數推導:
編譯器會自動根據傳入參數推導類型 T。
例如:Add(3, 5) 推導出 T = int。
顯式指定類型:
Add<int>(3, 5); // 顯式指定 T = int
二、類模板(Class Template)
template <typename T>
class 類名 {// 類成員
};
#include <iostream>
using namespace std;// 類模板:棧
template <typename T>
class Stack {
private:T data[100];int top;
public:Stack() : top(0) {}void push(T value) {data[top++] = value;}T pop() {return data[--top];}
};int main() {Stack<int> intStack; // int 類型棧Stack<char> charStack; // char 類型棧intStack.push(10);intStack.push(20);cout << intStack.pop() << endl; // 輸出 20charStack.push('A');cout << charStack.pop() << endl; // 輸出 Areturn 0;
}
解釋:
Stack<int> 和 Stack<char> 是兩個不同類型的類。
優點:通過模板,用一份代碼生成多個類型版本。
注意事項
模板類與普通類的區別:
模板類本身不是類,而是類的生成規則。
實例化后(如 Stack<int>)才是真正的類。
模板參數不止是類型:
可以是常量值(如 int N),例如:
template <int N>
class Array {T data[N];
};
三、模板的限制與常見錯誤
示例 1:類型不匹配
Add("Hello", 123); // 編譯錯誤!字符串和整數不能推導出統一的 T
示例 2:忘記包含頭文件
// 忘記 #include <string>
string str; // 錯誤!
模板的進階學習建議
模板特化:為特定類型定制行為。
模板元編程:利用模板實現編譯期計算。
STL 源碼:學習標準庫中模板的高級用法(如 vector<T>、map<K, V>)。
小練習
試著用模板實現一個通用的最大值比較函數:
template <typename T>
T Max(T a, T b) {return (a > b) ? a : b;
}
看看它能否支持 int、double、string!
希望這篇博客能幫你快速入門 C++ 模板!