函數(shù)模板
- 如下面的函數(shù)模板參數(shù):
template<class T1, class T2, class T3>
其中,T1笋轨,T2,T3三個類型赊淑,只有出現(xiàn)在函數(shù)形參中的參數(shù)可以被編譯器自動推導(dǎo)出來爵政,否則的話,寫在返回值和函數(shù)內(nèi)部的類型陶缺,編譯器是不負(fù)責(zé)推導(dǎo)的钾挟,此時需要調(diào)用者指定具體類型才可以,所以推薦可以被自動推導(dǎo)的類型寫在后面饱岸,不人為指定掺出,其余需人為指定的寫在前面。
- 函數(shù)模板可以被重載苫费,分為如下兩種情況:
(1)模板函數(shù)的具體化
- 此函數(shù)相對于模板函數(shù)有更高優(yōu)先級被匹配到;
- 支持參數(shù)的自動類型轉(zhuǎn)化(模板函數(shù)不支持)汤锨;
- 手動調(diào)用的話,也可以加上<T>百框,來指定調(diào)用那個具體化的版本闲礼。
(2)不一樣參數(shù)數(shù)量的重載;
類模板
1 簡單的類模板定義與函數(shù)模板基本相同铐维,使用模板定義類時注意柬泽,函數(shù)參數(shù)能使用const T&的地方也盡量使用;
2 類模板的重載分為特化與偏特化兩種
特化的首要要求是必須特化類的所有成員函數(shù)嫁蛇。
類模板的定義是:
template<class T>
class Stack {};
特化則是:
template<>
class Stack<string> {};
類模板的定義是:
template<class T1, class T2>
class MyClass {};
偏特化則是偏特化一部分:
template<class T> //模板參數(shù)數(shù)量可以變化锨并;
class MyClass<T, T> { //類名后面一定要跟著尖括號;
public:
void print() {
cout << "222" << endl;
}
};
template<class T1, class T2>
class MyClass<T1*, T2*> {
public:
void print() {
cout << "333" << endl;
}
};
template<class T>
class MyClass<T*, T*> {
public:
void print() {
cout << "555" << endl;
}
};
template<class T>
class MyClass<T, int> {
public:
void print() {
cout << "444" << endl;
}
};
偏特化的過程中只要不重復(fù)就都可以睬棚,但是不保證實際調(diào)用的時候不發(fā)生ambiguous:
MyClass<int, int>在MyClass<T,T>和MyClass<T1,T2>之間發(fā)生ambugious第煮,如果定義了更好的匹配,MyClass<T, T>就沒有問題了抑党。
3 類模板也可以使用默認(rèn)參數(shù)包警,如:
template<class T, class U = vector<T>> //如此定義之后對使用也有了相應(yīng)要求
class Stack {};
函數(shù)模板與類模板中的non-type模板參數(shù)
template<>尖括號里面的不一定是class/typename定義的類型,還可以是類似于變量聲明的樣子:
template<class T, int MAXSIZE>
class MyClass {};
或者:
template<class T, int MAXSIZE>
void func() {}
那個類似于變量聲明的參數(shù)就是nontype參數(shù)新荤,這個參數(shù)感覺類似于有類型的常量(當(dāng)然只能是int類型的)揽趾,在編譯器處理之后,會進(jìn)行常量的替換苛骨,nontype不同時篱瞎,類型/函數(shù)也認(rèn)為不一樣苟呐。
ps. nontype的參數(shù)至少是const的,由于const是運行期常量俐筋,所以MAXSIZE的替換操作不一定是在什么時候呢牵素。
兩個用途是:
- 放在class template里,可以在后期決定數(shù)組的大小是多大澄者,比如:
template<class T, int MAXSIZE>
class Stack {
T nums[MAXSIZE];
};
不同時候用笆呆,可能有不同的且明確的大小,此時可以使用這種情況粱挡。
- 函數(shù)template中使用時赠幕,可以用于定義仿函數(shù),與STL中的算法函數(shù)搭配使用:
template<class T, int MAXSIZE>
int func(int a) {
return a + MAXSIZE;
}
transform(arr.begin(), arr.end(), func<int, 10>); //可以用于生成合適的函數(shù)指針