举例:实现compare函数的函数模板、函数模板的特例化、非模板函数、 函数模板的重载。
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
52 1template<typename T>//函数模板
2bool compare(const T a, const T b)
3{
4 cout << "bool compare(const T a, const T b)" << typeid(T).name() << endl;
5 return a > b;
6}
7
8typedef char* CharPtr;
9template<>//模板的特例化
10bool compare<CharPtr>(const CharPtr a, const CharPtr b)
11{
12 cout << "bool compare<CharPtr>(const CharPtr a, const CharPtr b)" << endl;
13 return strcmp(a, b)> 0;
14}
15
16bool compare(const double a,const double b)//非模板函数
17{
18 cout << "bool compare(const double a,const double b)" << endl;
19 return a > b;
20}
21
22template<typename T>//函数模板的重载
23bool compare(const T arr1, int len1, const T arr2, int len2)
24{
25 cout << "bool compare(const T arr1, int len1, const T arr2, int len2)" << endl;
26 for (int i = 0, j = 0; i < len1&&j < len2; i++, j++)
27 {
28 if (arr1[i]>arr2[j])
29 {
30 return true;
31 }
32 if (i == len1)
33 {
34 return false;
35 }
36 }
37 return true;
38}
39
40int main()
41{
42 compare(10,20);
43 compare(10.0, 20.0);
44 compare("hello", "world");
45 compare<char *>("hello", "world");
46 compare("hello", 5, "world", 5);
47
48 return 0;
49}
50
51
52
执行结果:
举例:类型作为模板类型参数。
实现选择排序的函数模板,排序又分为由大到小和由小到大,可实现其对应的函数模板和模板的特例化,将以上函数模板和模板的特例化,定义为一种类型,作为选择排序函数模板的类型参数。
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 1template<typename T>
2bool Mymore(const T a,const T b)
3{
4 cout << "bool Mymore(const T a,const T b)" << typeid(T).name() << endl;
5 return a > b;
6}
7
8typedef char* CharPtr;
9template<>
10bool Mymore<CharPtr >(const CharPtr a, const CharPtr b)
11{
12 cout << "bool Mymore<CharPtr >(const CharPtr a, const CharPtr b)" << endl;
13 return strcmp(a, b) > 0;
14}
15
16template<typename T>
17bool myless(const T a, const T b)
18{
19 cout << "bool myless(const T a, const T b)" << typeid(T).name() << endl;
20 return a < b;
21}
22
23template<>
24bool myless<CharPtr >(const CharPtr a, const CharPtr b)
25{
26 cout << "bool myless<CharPtr >(const CharPtr a, const CharPtr b)" << endl;
27 return strcmp(a, b) < 0;
28}
29
30//类型作为模板类型参数
31template<typename T,typename PRE>//////////////////PRE自动推演出模板类型参数
32void Sort(T arr[], int len,PRE pre)
33{
34 cout << "void Sort(T arr[], int len,PRE pre)" << typeid(T).name() << endl;
35 cout << typeid(PRE).name() << endl;
36 T tmp;
37 int i;
38 for (i = 0; i < len; i++)
39 {
40 for (int j = i; j < len; j++)
41 {
42 //if (arr[i] > arr[j]) 从小到大
43 //if (arr[i] < arr[j]) 从大到小
44 //if (Mymore(arr[i], arr[j]))
45 ///if (myless(arr[i],arr[j]))
46 if (pre(arr[i], arr[j]))
47 {
48 tmp = arr[i];
49 arr[i] = arr[j];
50 arr[j] = tmp;
51 }
52 }
53 }
54}
55
56
57int main()
58{
59 int arr[] = { 1, 2,99};
60 Sort(arr, 3,Mymore<int>);//注意传参方式!!!
61 for (int i = 0; i < 3; i++)
62 {
63 cout << arr[i] << " ";
64 }
65 cout << endl;
66
67 char *arr2[] = { "aas","frg","dfg" };
68 Sort<char*>(arr2, 3,myless<char*>);
69 for (int i = 0; i < 3; i++)
70 {
71 cout << arr2[i] << " ";
72 }
73 cout << endl;
74}
75
运行结果: