- C語言的變量必須先聲明後使用。
- 由於數據類型的不同,很多相同的處理得為它們設置不同的副本。例如:
int findMax(int a, int b){
return (a > b) ? a : b;
}
double findMax(double a, double b){
return (a > b) ? a : b;
}
- 模板的引入就是為了類型的參數化。
- 函數的形參數據類型可變,稱為函數模板,實際上代表了一組函數。
- 相似地,類模板的數據成員類型也是可變的。
函數模板:
- 使用條件:運算相同,只有操作數據類型不同。
- 定義形式:
template<class T1, class T2,...>
{函數體}
- class不可省略;
- 函數體內部涉及具體數據類型時,應用上面自定義的模板參數取代;
- 在template中定義的所有參數都必須出現在函數的形參列表中,原因在於函數模板的工作方式,在使用方法中會講。
- 例子:
template<class T>
T Max(T r1, T r2){
T temp = (r1 > r2)? r1 : r2;
return temp;
}
- 使用方法:
- 必須將函數模板中的類型參數實例化才可使用。
- 函數模板實例化是自動的過程,根據實參類型確定。
- 注意:模板不會對數據類型進行隱式轉化。因此C++允許函數模板使用多個模板參數,或者用非模板重載一個同名函數。
template <class T, class D>
T max(T a, D b){
...
}
int max(int a, int b){
...
}
在這種情況下就會容易出現二義性問題。先了解函數與函數模板的調用規則:
- 先查找普通函數,否則;
- 查找函數模板,否則;
- (隱式)類型轉換,這裏只能在普通函數中進行;
- 以上都不能實現,或者在第三步中發現有多個函數可以匹配,就會出現錯誤;
類模板
- 定義形式:
template <class 模板參數1, ...>
class className{
...
}
- 注意:如果類的成員函數在類外定義,必須在每個函數名前面再加上template。
template <class ELEMENT_TYPE>
class List{
ELEMENT_TYPE* vector;
int len;
public:
List(int length);
...
}
template <class ELEMENT_TYPE>
List<ELEMENT_TYPE>::List(int length){
...
}
- 類模板實例化形式:(類模板+具體類實例化)
List<int> int_list;
以上實例化有兩個步驟:
- 類模板實例化為int型;
- 具體類的實例化,定義一個int型類的實例;
- 類模板的繼承和派生
普通類 -> 類模板 -> 類模板 -> 普通類
- 在類模板派生類模板時,定義子類要注意傳遞基類的模板
template <class T>
class Base{
...
}
template <class T1, class T2>
class Base_2 : public Base<T2>{
public:
void func(T1, obj1, T2 obj2){
...
}
}
int main(){
Base_2<char*, double> obj;
}
類似,在類模板派生普通類時,直接傳遞具體基類模板類型即可。
class Base_2 : public Base<double>{
...
}
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。