C++中函数模板的概念和意义
1,对泛型编程进行学习,泛型编程是实际工程开发中必用的技术,大型公司的通用 库都是采用泛型编程的技术完成的,C++ 中支持泛型编程技术,C++ 中的函数 模板和类模板就是 C++ 中泛型编程技术,本文分析 C++ 中的模板;
2,每一样技术 的引入都是为了解决一定的问题,下面将通过一个例子让大家意识到问题的存在,才能体会泛型编程的精妙之处;
3,C++ 中有几种交换变量的方法?
1,宏代码块;
2,函数;
4,定义宏代码块 VS 定义函数(全局的):
5,变量的交换编程实验:
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 #define SWAP(t, a, b) \ // 宏能够完美的解决交换的问题,但是由于宏是预处理器处理的单元,也就是后续的编译器根本不知道宏的存在,因此不建议用宏完成类似的函数功能,推荐直接写函数;
7 do \
8 { \
9 t c = a; \
10 a = b; \
11 b = c; \
12 }while(0)
13
14
15 void Swap(int& a, int& b) // 要用引用来交换
16 {
17 int c = a;
18 a = b;
19 b = c;
20 }
21
22 void Swap(double& a, double& b)
23 {
24 double c = a;
25 a = b;
26 b = c;
27 }
28
29 void Swap(string& a, string& b)
30 {
31 string c = a;
32 a = b;
33 b = c;
34 }
35
36 int main()
37 {
38 /*
39 int a = 0;
40 int b = 1;
41
42 Swap(int, a, b);
43
44 cout << "a = " << a << endl; // a = 1;
45 cout << "b = " << b << endl; // b = 0;
46
47 double m = 2;
48 double n = 3;
49
50 Swap(double, m, n);
51
52 cout << "m = " << m << endl; // m = 3;
53 cout << "n = " << n << endl; // n = 2;
54 */
55 int a = 0;
56 int b = 1;
57
58 Swap(a, b);
59
60 cout << "a = " << a << endl; // a = 1;
61 cout << "b = " << b << endl; // b = 0;
62
63 double m = 2;
64 double n = 3;
65
66 Swap(m, n);
67
68 cout << "m = " << m << endl; // m = 3;
69 cout << "n = " << n << endl; // n = 2;
70
71 string d = "Delphi";
72 string t = "Tang";
73
74 Swap(d, t);
75
76 cout << "d = " << d << endl; // d = Delphi;
77 cout << "t = " << t << endl; // t = Tang;
78
79 return 0;
80 }
1,每当要交换两个变量的值的时候,就需要重载 Swap() 函数,而 Swap() 函 数的程序逻辑一点改变都没有,做的仅仅是复制粘贴改类型,这其实是重复的没有技术含量的活;
2,使用宏不安全、函数重载复制粘贴改类型,重复性劳动;
6,定义宏代码块:
1,优点:代码复用,适合所有的类型;
2,缺点:编译器不知道宏的存在,缺少类型检查(不安全);
定义函数:
1,优点:真正的函数调用,编译器对类型进行检查;
2,缺点:根据类型重复定义函数,无法代码复用;
7,C++ 中有没有解决方案集合两种方法的优点?
1,有,泛型编程;
8,泛型编程概念:
1,不考虑具体数据类型的编程方式;
1,对于 Swap 函数可以考虑下面的泛型写法:
1,代码示例:
1 void Swap(T& a, T& b)
2 {
3 T t = a;
4 a = b;
5 a = t;
6 }
2,Swap 泛型写法中的 T 不是一个具体的数据类型,而是泛指任意的数据类型;
9,C++ 中泛型编程:
1,函数模板:
1,一种特殊的函数可用不同类型进行调用;
2,看起来和普通函数很相似,区别是类型可被参数化:
1,代码示例:
1 template<typename T> // 定义了一个模板,里面有一个类型名 T,泛指各种类型;
2 void Swap(T& a, T& b)
3 {
4 T t = a;
5 a = b;
6 b = t;
7 }
3,函数模板的语法规则:
1,template 关键字用于声明开始进行泛型编程;
2,typename 关键字用于声明泛指类型;
4,函数模板的使用:
1,自动类型推导调用;
1,根据实参类型进行推导;
2,具体类型显示调用;
1 int a = 0; 2 int b = 1; 3 4 Swap(a, b); // 自动推导;根据参数自动推导模板中的 T 应该为 int 类型; 5 6 float c = 2; 7 float d = 3; 8 9 Swap<float>(c, d); // 显示调用;显示告诉函数模板中的 T 是一个 float 类型;
10,函数模板使用初探编程实验:
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 template < typename T > // 开始泛型编程,泛指类型是 T;在下面函数定义中用 T 可以代表类型;
7 void Swap(T& a, T& b)
8 {
9 T c = a;
10 a = b;
11 b = c;
12 }
13
14 template < typename T >
15 void Sort(T a[], int len)
16 {
17 for(int i=0; i<len; i++)
18 {
19 for(int j=i; j<len; j++)
20 {
21 if( a[i] > a[j] )
22 {
23 Swap(a[i], a[j]);
24 }
25 }
26 }
27 }
28
29 template < typename T >
30 void Println(T a[], int len)
31 {
32 for(int i=0; i<len; i++)
33 {
34 cout << a[i] << ", ";
35 }
36
37 cout << endl;
38 }
39
40 int main()
41 {
42 /* 以下是交换数据函数模板测试代码 */
43 int a = 0;
44 int b = 1;
45
46 Swap(a, b); // 自动推导,等价于 Swap<int>(a, b);
47
48 cout << "a = " << a << endl; // a = 1;
49 cout << "b = " << b << endl; // b = 0;
50
51 double m = 2;
52 double n = 3;
53
54 Swap(m, n); // 自动推导,等价于 Swap<double>(a, b);
55
56 cout << "m = " << m << endl; // m = 3;
57 cout << "n = " << n << endl; // n = 2;
58
59 string d = "Delphi";
60 string t = "Tang";
61
62 Swap<string>(d, t); //显示指定;将 T 替换成 string,然后进行调用;
63
64 cout << "d = " << d << endl; // d = Delphi;
65 cout << "t = " << t << endl; // t = Tang;
66
67 /* 以下是选择排序算法测试代码 */
68
69 int a[5] = {5, 3, 2, 4, 1};
70
71 Println(a, 5); // 5, 3, 2, 4, 1
72 Sort(a, 5); // 自动推导
73 Println(a, 5); // 1, 2, 3, 4, 5
74
75 string s[5] = {"Java", "C++", "Pascal", "Ruby", "Basic"};
76
77 Println(s, 5); // Java, C++, Pascal, Ruby, Basic,
78 Sort(s, 5);
79 Println(s, 5); // Basic, C++, Java, Pascal, Ruby,
80
81 return 0;
82 }
1,使用函数模板程序中代码复用率大大增加;
2,大公司中自己通用库都是使用泛型编程、模板技术来完成的;
3,模板技术、泛型编程,非常适合于用来写算法,通用库都是使用模板技术完成;
11,小结:
1,函数模板是泛型编程在 C++ 中的应用方式之一;
1,之二是类模板;
2,函数模板能够根据实参对参数类型进行推导;
3,函数模板支持显示的指定参数类型;
4,函数模板是 C++ 中重要的代码复用方式;


浙公网安备 33010602011771号