泛型程序設計
交換兩個變量值的函數模板
template <class T>
void Swap(T & x,T & y)
{
T tmp = x;
x = y;
y = tmp;
}
int main(){
int n = 1, m = 2;
Swap(n, m); //編譯器自動生成 void Swap(int &, int &)函數
double f = 1.2, g = 2.3;
Swap(f, g); //編譯器自動生成 void Swap(double &, double &)函數
return 0;
}
函數模板中可以有不止一個類型參數
template<class T1, class T2>
T2 print(T1 arg1, T2 arg2)
{
cout<< arg1 << " "<< arg2<<endl;
return arg2;
}
函數模板可以重載, 只要它們的形參表不同即可
template<class T1, class T2>
void print(T1 arg1, T2 arg2)
{
cout<< arg1 << " "<< arg2<<endl;
}
template<class T>
void print(T arg1, T arg2)
{
cout<< arg1 << " "<< arg2<<endl;
}
C++編譯器遵循以下優先順序:
Step 1: 先找參數完全匹配的普通函數(非由模板實例化而得的函數)
Step 2: 再找參數完全匹配的模板函數
Step 3: 再找實參經過自動類型轉換后能夠匹配的普通函數
Step 4: 上面的都找不到, 則報錯
template<class T>
T myFunction(T arg1, T arg2)
{
cout<<arg1<<“ ”<<arg2<<“\n”;
return arg1;
}
myFunction(5, 8.4); //error: replace T with int or double? 二義性
//使用多個類型的參數避免二義性
template<class T1, class T2>
T1 myFunction( T1 arg1, T2 arg2)
{
cout<<arg1<<“ ”<<arg2<<“\n”;
return arg1;
}