欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++中函数模板的概念和意义

程序员文章站 2022-05-03 22:35:57
1,对泛型编程进行学习,泛型编程是实际工程开发中必用的技术,大型公司的通用 库都是采用泛型编程的技术完成的,C++ 中支持泛型编程技术,C++ 中的函数 模板和类模板就是 C++ 中泛型编程技术,本文分析 C++ 中的模板,也就是 这节课将带领大家进入 C++ 的泛型编程的世界; 2,每一样技术 的 ......

1,对泛型编程进行学习,泛型编程是实际工程开发中必用的技术,大型公司的通用 库都是采用泛型编程的技术完成的,c++ 中支持泛型编程技术,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++ 中重要的代码复用方式;