C++ 模板

本文从WordPress迁移而来, 查看全部WordPress迁移文章

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
测试理解函数调用的先后顺序
1.找到一个【普通函数】,参数类型匹配,则调用
2.找到一个函数模板,参数类型对应匹配,可以实例化为一个模板函数,则调用
3.找到一个【普通函数】,参数类型并不匹配,但是可以通过类型转换变得匹配,则调用
4.否则这次调用是错误的

理解好这个规则了,一定要调用时候的二义性
*/
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;


int MAX(int a,int b){
puts("int MAX");
return a > b ? a : b;
}


double MAX(double a,double b){
puts("double MAX");
return a > b ? a : b;
}

template<typename T>
T MAX(T a,T b){
puts("template MAX");
return a > b ? a : b;
}

int main(){
cout << MAX(1,2) << endl;
cout << MAX(1.5,2.5) << endl;
cout << MAX(5,'a') << endl;;
cout << MAX('a','c') << endl;
//cout << MAX(1,5.5) << endl;
return 0;

/*
1.尝试只保留 double MAX , T MAX
然后调用MAX(1,2) , 调用的是T MAX(实例化为一个 int MAX)
这个调用顺序证明了程序最顶部的注释
2.尝试只保留 double MAX , T MAX
然后调用MAX(1,5.5),调用的是double MAX (返回5.5),因为模板参数类型不匹配,
只好找到一个普通函数,进行强制类型转换
同理,如果只保留 int MAX , T MAX , 调用 MAX(1,5.5),也会调用int MAX (返回5)
*/
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
在自定义的类型了,重载好需要用到的运算符,< , > ,+ , - , * , / 等
那么在实例化后的模板函数中就可以使用
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

struct student{
int id,val;
student(){}
student(int i,int v):id(i),val(v){}
bool operator > (const student &temp)const{
return val > temp.val;
}
};

template<typename T>
T MAX(T &x , T &y){
if(x > y) return x;
else return y;
}

int main(){
student a(1,90);
student b(2,95);
student res = MAX(a,b);
cout << res.val << endl;
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
/*
函数模板不支持默认参数,类模板支持
在c++11标准中,函数模板支持默认参数

编译出错:
template<typename TA , typename TB = double>
TB MAX(TA a , TB b){
if(a > b) return (TB)a;
else return b;
}
*/