模板是類/函數的藍圖,參數化類型或值,實現編譯期多態(泛型編程)。
template
int cmp(const T& a, const T& b) {
if (a < b) return -1;
if (b < a) return 1;
return 0;
}
template
class Stack {
void push(const T& v);
// ...
};
template
void Stack::push(const T& v) { /* ... */ }
類模板名實際為 Stack<T>,類外定義需帶模板參數列表。
typename T / class T,代表任意類型。作用域遮蔽外部同名類型。用於類型聲明、返回值、參數等。
編譯期常量值,如 int N、指針、引用、枚舉。限制:
template
class Array { T data[N]; };
typename T = int),非類型參數亦可。template class Buffer {};
Stack s1; // 隱式
template class Stack; // 顯式實例化(僅聲明類,不創建對象)
調用 cmp(1, 2) → 推導 T=int 生成 cmp(int,int);cmp(1.0, 2.0) → 生成 cmp(double,double)。
推導規則:
const 轉換、數組/函數退化為指針)。當返回類型無法從參數推導時,需顯式指定:
template
T1 sum(T2 a, T3 b);
long res = sum(1, 10L); // 顯式指定 T1=long, T2=int, T3=long
在模板內訪問嵌套類型成員時,必須加 typename 告訴編譯器這是類型而非靜態成員:
template
void foo(T* p) {
typename T::value_type v; // 必須加 typename
}
本文涵蓋模板定義語法、參數分類、默認值、實例化機制、函數模板推導規則與顯式指定。下篇將講解成員模板、模板特化、別名模板、可變參數模板及 C++20 Concepts。