重載函數雖能處理多類型,但每增加一種類型就要寫一個版本,且無法覆蓋未預料的類型(如用戶自定義類)。模板實現「類型參數化」,一份代碼服務所有符合要求的類型,實現真正的代碼復用。
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)。template void print(Args... args); this-> 或 typename)。typename 而非 class,語義更清晰。std::enable_if / concepts 給出友好錯誤信息。