1. 程式人生 > 實用技巧 >函式模板的知識點總結

函式模板的知識點總結

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. 編譯器匹配優先順序

普通函式定義>具體化>模板函式