函數模板、重載解析

爲了交換int的兩個值,我們可以定義一個交換int的函數swap(int a,int b),但是當我們要交換一個char的值時,我們又要定義一個char的swap函數,沒定義一種類型的函數,我們都要定義相應的函數,爲了避免因爲類型不同而重新定義函數,我們可以使用函數模板( 函數的功能相同,只是處理數據的類型不同,統一定義一個模板)。

//創建模板1
template <typename Type>
void  Swap( Type &a, Type &b ) {
	Type temp;
	temp=a;
	a=b;
	b=temp;
}
我們可以利用模板直接生成函數,如下:
<pre name="code" class="cpp">	int a=10;
	int b=5;
	cout<<"swapInt前a="<<a<<" b="<<b<<"\n";
	Swap(a,b);
	cout<<"swapInt後a="<<a<<" b="<<b<<"\n";



利用模板生成了一個int型的swap,如果a或者b有一個是float類型,編譯器會自動將其轉換成適當的類型,但精度會缺失

但模板並不是萬能的,比如typename是一個對象實例,這個時候就無法利用模板來交換對象實例的值,爲此我們需要對特定的類型,進行顯性具體化,如下

struct job
{
	int data;
};
//針對job對象進行實例化
template<> void  Swap<job>(job &a, job  &b)
{
	int temp;
	temp=a.data ;
	a.data =b.data ;
	b.data =temp;
}
這樣我們就可以調用swap對對象job進行交換數值,但這樣是不夠的,當我們要交換一個數組時,參數中還要傳數值的長度,這個時候上面的模板函數也是無能爲力,此時,這個時候,我們可以用函數模板重載,沒錯,函數可以重載,函數模板也可以重載,下面我們來對swap這個函數模板進行重載

template <typename Type>
void Swap(Type a[],Type b[],int n)
{
	Type temp;
	for(int i=0;i<n;i++)
	{
		temp=a[i];
		a[i]=b[i];
		b[i]=temp;
	}

}

	char swapStringA[5]="abcd";
	char swapStringB[5]="efgh";
	cout<<"數組交換前"<<"\n";
	cout<<"swapStringA is "<<swapStringA<<"\n";
	cout<<"swapStringB is "<<swapStringB<<"\n";\
    Swap(swapStringA,swapStringB,4);
	cout<<"數組交換後"<<"\n";
	cout<<"swapStringA is "<<swapStringA<<"\n";
	cout<<"swapStringB is "<<swapStringB<<"\n";

這個時候我們可以調用
Swap(swapStringA,swapStringB,4);
來實現兩個數組的交換數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章