函数模板遇上函数重载

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

函数模板遇上函数重载
当函数模板的名称和普通函数的名称⼀样时,会发⽣函数重载。

1 #include <iostream>
2using namespace std;
3
4//函数模板
5 template <typename T>
6void myfun(T& x,T& y)
7 {
8 cout<<"我是函数模板"<<endl;
9 }
10
11//普通函数
12void myfun(int a,char c)
13 {
14 cout<<"我是普通函数"<<endl;
15 }
16
17int main()
18 {
19int x=10;
20char y='Y';
21
22 myfun(x,y);//两个输⼊参数类型不⼀样,且与普通函数的输⼊类型⼀致,调⽤的是普通函数
23 myfun(y,x);//两个输⼊参数类型不⼀样,但与普通函数的输⼊类型不⼀致,调⽤的是普通函数,因为普通函数之间会有⼀个隐式的类型转换
24 myfun(x,x);//两个输⼊参数类型⼀样,调⽤的是函数模板,函数模板的本质是类型参数化,将严格按照类型匹配,不会进⾏⾃动类型转换25
26return0;
27 }
关于函数模板和普通函数在⼀起出现时,有以下⼏个原则:
1.函数模板可以像普通函数⼀样被重载;
2.C++编译器优先考虑普通函数;
3.如果函数模板可以产⽣⼀个更好的匹配,那么选择函数模板;
4.可以通过空模板实参列表的语法限定编译器只能调⽤模板函数;
1 #include <iostream>
2using namespace std;
3
4//函数模板
5 template <typename T>
6 T Max(T x,T y)
7 {
8 cout<<"调⽤的是函数模板 ";
9return x>y?x:y;
10 }
11
12//函数模板的重载
13 template <typename T>
14 T Max(T x,T y,T z)
15 {
16 cout<<"调⽤的是函数模板的重载 ";
17return Max(Max(x,y),z);
18 }
19
20
21//普通函数
22int Max(int x,int y)
23 {
24 cout<<"调⽤的是普通函数 ";
25return x>y?x:y;
26 }
27
28
29int main()
30 {
31int x=10;
32int 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
42return0;
43 }。

相关文档
最新文档