函式模板的知識點總結
阿新 • • 發佈:2020-07-19
1. tempate<typename Anytype>等價於 template<class Anytype>;
2. 最終程式碼不包含模板,而是包含了由模板為函式生成的具體函式;
3. 函式模板的過載:使用不同的特徵標,特徵標中可以有具體型別,如int,而不是泛型;
4.具體化包括:隱式例項化,顯式例項化,顯式具體化,下面看區別:
①隱式例項化&顯式具體化:
#include<iostream> #include<typeinfo> using namespace std; template<typename T> void Swap(T& a, T& b); int main() { int i = 5, j = 6; Swap(i,j);//隱式模板函式例項化 cout<<"i:"<<i<<" j:"<<j<<endl; double a = 7.0, b = 8.0; Swap<double>(a,b);//顯式模板函式例項化 cout << "a:" << a << ",type info of a :" << typeid(a).name() << endl<< "b:" << b<< ",type info of b :" << typeid(b).name() <<endl; return 0; } template<typename T> void Swap(T& a,T& b) { T tmp; tmp = a; a=b; b = tmp; }
②具體化不同於例項化。例項化是通過模板函式定義例項對應的具體函式定義的過程;而具體化是為特定型別,提供不同於模板函式定義的具體化操作,看下面這個例子:
struct job {
char name[40];
double salary;
int floor;
};
//顯式具體化 template<> void Swap<job>(job &j1,job &j2);xiangdui
參看P287 程式清單,當我們想對job結構中的salary,floor進行交換,而name不交換的時候,那就需要使用顯示具體化,來完成不同於模板函式定義的操作;如果使用模板定義進行交換,則name,saraly,floor都會進行交換。
5. 編譯器匹配優先順序
普通函式定義>具體化>模板函式