爲了交換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);
來實現兩個數組的交換數據