通過函數模板定義的函數如果和普通函數名稱相同,以及重載函數模板,我們在調用這個函數的時候,到底是執行哪一個函數。
#include"header.h"
using std::cout;
using std::endl;
void swap(int& a, int& b) //交換兩個int變量
{
if (a != b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
}
void swap(double& a, double& b) //交換兩個double變量
{
if (a != b)
{
a = a + b;
b = a - b;
a = a - b;
}
}
void swap(char& a, char& b) //交換兩個字符
{
char c = a;
a = b;
b = c;
}
template<typename T> //函數模板
inline void swap(T& a, T& b)
{
T tmp = a;
a = b;
b = tmp;
}
template<typename T1,typename T2> //重載函數模板
inline void swap(T1& a, T1& b,T2 c)
{
T1 tmp = a;
a = b;
b = tmp;
}
void output(char a, char b, int i, int j, double x, double y)
{
cout << "a:" << a << " b:" << b << endl;
cout << "i:" << i << " j:" << j << endl;
cout << "x:" << x << " y:" << y << endl << endl;
}
int main()
{
char a = '1', b = '2';
int i = 1, j = 2;
double x = 1, y = 2;
output(a, b, i, j, x, y);
swap<char>(a, b); //顯式調用
swap(i, j); //自動類型推導
swap(x, y); //自動類型推導
swap(a,b,'c'); //調用重載的函數模板
output(a, b, i, j, x, y);
return 0;
}
swap<char>(a, b); 無疑會調用函數模板,因爲這是顯式的指定調用函數模板。但是swap(i, j);和swap(x, y);則不會調用函數模板,而是調用了重載了的swap函數。swap(a,b,'c');則是調用了重載的函數模板。函數模板和普通函數的調用規則如下:
1.優先調用普通函數
2.如果模板可以產生一個更好的匹配,那麼調用模板。
3.通過<>可以強制調用函數模板。
普通函數是一定存在隱式類型轉換的。
當你顯式指定類型,那麼函數模板會發生隱式類型轉換;函數模板自動類型推導不發生隱式類型轉換。