泛型編程:以獨立於具體類型的方式編寫代碼,使用時再提供具體類型或值。STL 容器、迭代器、算法皆為泛型編程典範。與面向對象的運行時多態(虛函數)不同,泛型編程依賴編譯時多態(參數多態),由編譯器根據實參推導類型並生成專用代碼,零運行時開銷。
比較 int、double、string 等類型時,邏輯完全相同,僅類型不同。函數重載導致代碼膨脹,且無法覆蓋未知類型。
template <typename T>
int compare(const T& v1, const T& v2) {
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
template <typename T>:模板參數列表,typename 與 class 等價。compare(a, b) 時,編譯器從實參類型推導 T,實例化具體函數。template <typename T> inline T min(const T&, const T&); // inline 置於參數表後
template <typename Type>
class Queue {
public:
Queue();
Type& front();
const Type& front() const;
void push(const Type&);
void pop();
bool empty() const;
private:
// ...
};
template <typename Type>
void Queue<Type>::push(const Type& v) { /* ... */ }
注意:類模板成員函數定義通常置於頭文件,因為編譯器需在使用處看到完整定義以實例化。
| 類別 | 關鍵字 | 說明 |
|---|---|---|
| 類型參數 | typename T / class T | 代表任意類型 |
| 非類型參數 | int N, bool Flag | 代表編譯期常量值 |
| 模板模板參數 | template<typename> class Container | 代表模板本身 |
using IntVec = vector<int>; 提升可讀性。模板是 C++ 泛型編程基石,函數模板構建算法庫,類模板構建容器庫。掌握「參數推導 → 實例化 → 代碼生成」流程,能寫出高效、可復用、類型安全的現代 C++ 代碼。