函数模板遇上函数重载
当函数模板的名称和普通函数的名称一样时,会发生函数重载。
1 #include <iostream> 2 using namespace std; 3 4 //函数模板 5 template <typename T> 6 void myfun(T& x,T& y) 7 { 8 cout<<"我是函数模板"<<endl; 9 } 10 11 //普通函数 12 void myfun(int a,char c) 13 { 14 cout<<"我是普通函数"<<endl; 15 } 16 17 int main() 18 { 19 int x=10; 20 char y='Y'; 21 22 myfun(x,y);//两个输入参数类型不一样,且与普通函数的输入类型一致,调用的是普通函数 23 myfun(y,x);//两个输入参数类型不一样,但与普通函数的输入类型不一致,调用的是普通函数,因为普通函数之间会有一个隐式的类型转换 24 myfun(x,x);//两个输入参数类型一样,调用的是函数模板,函数模板的本质是类型参数化,将严格按照类型匹配,不会进行自动类型转换 25 26 return 0; 27 }
关于函数模板和普通函数在一起出现时,有以下几个原则:
1.函数模板可以像普通函数一样被重载;
2.C++编译器优先考虑普通函数;
3.如果函数模板可以产生一个更好的匹配,那么选择函数模板;
4.可以通过空模板实参列表的语法限定编译器只能调用模板函数;
1 #include <iostream> 2 using namespace std; 3 4 //函数模板 5 template <typename T> 6 T Max(T x,T y) 7 { 8 cout<<"调用的是函数模板 "; 9 return x>y?x:y; 10 } 11 12 //函数模板的重载 13 template <typename T> 14 T Max(T x,T y,T z) 15 { 16 cout<<"调用的是函数模板的重载 "; 17 return Max(Max(x,y),z); 18 } 19 20 21 //普通函数 22 int Max(int x,int y) 23 { 24 cout<<"调用的是普通函数 "; 25 return x>y?x:y; 26 } 27 28 29 int main() 30 { 31 int x=10; 32 int y=20; 33 34 cout<<Max(x,y)<<endl;//C++编译器优先调用普通函数 35 cout<<Max<>(x,y)<<endl;//显示调用函数模板,调用的只能是函数模板 36 37 cout<<Max(3.0,4.0)<<endl;//函数模板产生更好的匹配,将调用函数模板 38 cout<<Max(3.0,4.0,5.0)<<endl;//重载 39 40 cout<<Max('A',50)<<endl;//无法与函数模板相匹配,调用普通函数(函数参数的隐式转换) 41 42 return 0; 43 }