函数模板遇上函数重载

当函数模板的名称和普通函数的名称一样时,会发生函数重载。

 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 }

 

posted @ 2018-03-05 14:35  8号prince  阅读(254)  评论(0编辑  收藏  举报