在模板函数和普通函数重载时,C++编译器对函数的调用规则如下:
当函数模板和普通函数都符合调用时,优先选择普通函数。如果想显示使用函数模板,则使用<>类型列表。
如果函数模板能产生更好的匹配,则使用函数模板。
函数模板不允许自动类型转化,普通函数能够进行制动类型转换。
规则一使用举例:
#include <iostream>
using namespace std;
int Max(int a, int b)
{
cout << "int Max(int a, int b)" << endl;
return a > b ? a :b;
}
template<typename T>
T Max(T a, T b)
{
cout << "T Max(T a,T b)" << endl;
return a > b ? a : b;
}
template<typename T>
T Max(T a, T b, T c)
{
cout << "T Mac(T a,T b,T c)" << endl;
return Max(Max(a, b), c);
}
int main()
{
int a = 1;
int b = 2;
cout << Max(a, b) << endl; //当函数模板和普通函数都符合调用时,优先选择普通函数
cout << Max<>(a, b) << endl; //若显示使用函数模板,则使用<> 类型列表
}
运行结果:
第一次调用时,函数模板和普通函数都符合调用条件,优先选普通函数。
第二次调用时,在Max后面加上了<>,则强制使用函数模板,所以会调用函数模板
规则二使用举例:
#include <iostream>
using namespace std;
int Max(int a, int b)
{
cout << "int Max(int a, int b)" << endl;
return a > b ? a :b;
}
template<typename T>
T Max(T a, T b)
{
cout << "T Max(T a,T b)" << endl;
return a > b ? a : b;
}
template<typename T>
T Max(T a, T b, T c)
{
cout << "T Mac(T a,T b,T c)" << endl;
return Max(Max(a, b), c);
}
int main()
{
cout << Max(3.0, 4.0) << endl; //如果 函数模板产生更好的匹配 使用函数模板
cout << Max(5.0, 6.0, 7.0) << endl; //重载
}
运行结果:
float转为int时会有精度的损失,所以普通函数不能匹配,这个时候只能选择函数模板。
规则三使用举例:
#include <iostream>
using namespace std;
int Max(int a, int b)
{
cout << "int Max(int a, int b)" << endl;
return a > b ? a :b;
}
template<typename T>
T Max(T a, T b)
{
cout << "T Max(T a,T b)" << endl;
return a > b ? a : b;
}
template<typename T>
T Max(T a, T b, T c)
{
cout << "T Mac(T a,T b,T c)" << endl;
return Max(Max(a, b), c);
}
int main()
{
cout << Max('a', 100) << endl; //调用普通函数 可以隐式类型转换
}