//交換 int 變量的值 void Swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp; } //交換 float 變量的值 void Swap(float *a, float *b){ float temp = *a; *a = *b; *b = temp; } //交換 char 變量的值 void Swap(char *a, char *b){ char temp = *a; *a = *b; *b = temp; } //交換 bool 變量的值 void Swap(bool *a, bool *b){ char temp = *a; *a = *b; *b = temp; }這些函數雖然在調用時方便了一些,但從本質上說還是定義了三個功能相同、函數體相同的函數,只是數據的類型不同而已,這看起來有點浪費代碼,能不能把它們壓縮成一個函數呢?
#include <iostream> using namespace std; template<typename T> void Swap(T *a, T *b){ T temp = *a; *a = *b; *b = temp; } int main(){ //交換 int 變量的值 int n1 = 100, n2 = 200; Swap(&n1, &n2); cout<<n1<<", "<<n2<<endl; //交換 float 變量的值 float f1 = 12.5, f2 = 56.93; Swap(&f1, &f2); cout<<f1<<", "<<f2<<endl; //交換 char 變量的值 char c1 = 'A', c2 = 'B'; Swap(&c1, &c2); cout<<c1<<", "<<c2<<endl; //交換 bool 變量的值 bool b1 = false, b2 = true; Swap(&b1, &b2); cout<<b1<<", "<<b2<<endl; return 0; }運行結果:
template
是定義函數模板的關鍵字,它後面緊跟尖括號<>
,尖括號包圍的是類型參數(也可以說是虛擬的類型,或者說是類型占位符)。typename
是另外一個關鍵字,用來聲明具體的類型參數,這裡的類型參數就是T
。從整體上看,template<typename T>
被稱為模板頭。T
。#include <iostream> using namespace std; template<typename T> void Swap(T &a, T &b){ T temp = a; a = b; b = temp; } int main(){ //交換 int 變量的值 int n1 = 100, n2 = 200; Swap(n1, n2); cout<<n1<<", "<<n2<<endl; //交換 float 變量的值 float f1 = 12.5, f2 = 56.93; Swap(f1, f2); cout<<f1<<", "<<f2<<endl; //交換 char 變量的值 char c1 = 'A', c2 = 'B'; Swap(c1, c2); cout<<c1<<", "<<c2<<endl; //交換 bool 變量的值 bool b1 = false, b2 = true; Swap(b1, b2); cout<<b1<<", "<<b2<<endl; return 0; }引用不但使得函數定義簡潔明了,也使得調用函數方便了很多。整體來看,引用讓編碼更加漂亮。
template <typename 類型參數1 , typename 類型參數2 , ...> 返回值類型 函數名(形參列表){
//在函數體中可以使用類型參數
}
,
分隔。類型參數列表以< >
包圍,形式參數列表以( )
包圍。typename
關鍵字也可以使用class
關鍵字替代,它們沒有任何區別。C++ 早期對模板的支持並不嚴謹,沒有引入新的關鍵字,而是用 class 來指明類型參數,但是 class 關鍵字本來已經用在類的定義中了,這樣做顯得不太友好,所以後來 C++ 又引入了一個新的關鍵字 typename,專門用來定義類型參數。不過至今仍然有很多代碼在使用 class 關鍵字,包括 C++ 標准庫、一些開源程序等。template<class T> void Swap(T &a, T &b){ T temp = a; a = b; b = temp; }除了將 typename 替換為 class,其他都是一樣的。
#include <iostream> using namespace std; //聲明函數模板 template<typename T> T max(T a, T b, T c); int main( ){ //求三個整數的最大值 int i1, i2, i3, i_max; cin >> i1 >> i2 >> i3; i_max = max(i1,i2,i3); cout << "i_max=" << i_max << endl; //求三個浮點數的最大值 double d1, d2, d3, d_max; cin >> d1 >> d2 >> d3; d_max = max(d1,d2,d3); cout << "d_max=" << d_max << endl; //求三個長整型數的最大值 long g1, g2, g3, g_max; cin >> g1 >> g2 >> g3; g_max = max(g1,g2,g3); cout << "g_max=" << g_max << endl; return 0; } //定義函數模板 template<typename T> //模板頭,這裡不能有分號 T max(T a, T b, T c){ //函數頭 T max_num = a; if(b > max_num) max_num = b; if(c > max_num) max_num = c; return max_num; }運行結果: