//交換 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;
}
運行結果: