所謂泛型編程就是以獨立於任何特定類型的方式編寫代碼。模板是泛型編程的基礎。模板是創建類或函數的藍圖或公式。
面向對象編程所依賴的多態性稱為運行時多態性,泛型編程所依賴的多態性稱為編譯時多態性或參數式多態性。
16.1 模板定義
我們可以不用為每個類型定義一個新函數,而是只定義一個函數模板(function template)。函數模板是一個獨立於類型的函數,可作為一種方式,產生函數的特定類型版本。
template <typename T>
int compare(const T &v1, const T &v2){
if(v1<v2)
return -1;
else if(v2<v1)
return 1;
else
return 0;
}
template <typename T>
int compare(const T &v1, const T &v2){
if(v1<v2)
return -1;
else if(v2<v1)
return 1;
else
return 0;
}模板定義以關鍵字template開始,後接模板形參表(template parameter list),模板形參表是用尖括號住的一個或多個模板形參(template parameter)的列表,形參之間以逗號分隔。
模板形參表不能為空。
1.模板形參表
模板形參表很像函數形參表,函數形參表定義了特定類型的局部變量但並不初始化那些變量,在運行時再提供實參來初始化形參。
同樣,模板形參表示可以在類或函數的定義中使用的類型或值。在函數內部,可以使用名字T引用一個類型,T表示哪個實際類型由編譯器根據所用的函數而確定。
2. 使用函數模板
使用函數模板時,編譯器會推斷哪個(或哪些)模板實參(template argument)綁定到模板形參。一旦編譯器確定了實際的模板實參,就稱它實例化(instantiate)了函數模板的一個實例。
cout <<compare("10","20")<<endl;
cout <<compare("10","20")<<endl;3. inline函數模板
函數模板可以用與非模板函數一樣的方式聲明為inline。說明符放在模板形參表之後,返回類型之前,不能放在關鍵字template之前。
template <typename T> inline
const T &the_min(const T &v1, const T &v2){
if(compare(v1, v2)==-1)
return v1;
else
return v2;
}
template <typename T> inline
const T &the_min(const T &v1, const T &v2){
if(compare(v1, v2)==-1)
return v1;
else
return v2;
}cout<<the_min(10,29)<<endl;
摘自 xufei96的專欄