C++函数模板

释放双眼,带上耳机,听听看~!

C++函数模板

举例:实现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

执行结果:

C++函数模板

举例:类型作为模板类型参数。

实现选择排序的函数模板,排序又分为由大到小和由小到大,可实现其对应的函数模板和模板的特例化,将以上函数模板和模板的特例化,定义为一种类型,作为选择排序函数模板的类型参数。


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

运行结果:

C++函数模板

给TA打赏
共{{data.count}}人
人已打赏
安全技术

node.js – JWT有效负载应该有多少信息?

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索