zoukankan      html  css  js  c++  java
  • 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++ 中重要的代码复用方式;

  • 相关阅读:
    一致性哈希算法
    Tcp 3次握手 4次挥手
    计算机字符编码编年史
    虚拟机字节码指令表 JVM
    计算机是如何计算的、运行时栈帧分析(神奇i++续)
    神奇的i++
    记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver
    String+、intern()、字符串常量池
    签名和加密的区别(详细)
    java之设计模式汇总
  • 原文地址:https://www.cnblogs.com/dishengAndziyu/p/10918509.html
Copyright © 2011-2022 走看看