• 函数模板-17


    一。泛型编程的概念

      1.不考虑具体数据类型的编程模式

       对于Swap函数可以考虑下面的泛型写法

    void Swap(T&a, T&b)
    {
           T t = a;
             a = b;
             b = t;     
      
    }

      2.函数模板的语法规则

      -template关键字用于声明开始进行的泛型编程

      -typename关键字用于声明反省

      template <typename T>

     3.函数模板的应用

      -自动类型推倒调用

      -具体类型显示调用

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    template <typename T>
    void Swap(T&a,T&b)
    {
        T t = a;
          a = b;
          b = t;  
        
    }
    int main(int argc, char *argv[])
    {
        int a = 1;
        int b = 2;
        
        Swap(a,b);
        cout << a <<" "<< b <<endl;
        
        float fa = 3;
        float fb = 4;
        Swap(fa,fb);
        cout << fa <<" "<< fb <<endl;
        
        char ca = 'ca';
        char cb = 'cb';
        Swap(ca,cb);
        cout << ca <<" "<< cb <<endl;
        
        cout << "Press the enter key to continue ...";
        cin.get();
        return EXIT_SUCCESS;
    }

    二。泛型算法

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    template<typename T>
    void Swap(T& a, T& b)
    {
        T t = a;
        a = b;
        b = t;
    }
    
    template<typename T>
    void SelectSort(T array[], int length)
    {
        for(int i=0; i<length; i++)
        {
            T min = array[i];
            int index = i;
            
            for(int j=i+1; j<length; j++)
            {
                if( array[j] < min )
                {
                    min = array[j];
                    index = j;
                }
            }
            
            Swap(array[i], array[index]);
        }
    }
    
    int main(int argc, char *argv[])
    {
        int array[] = {3, 2, 5, 3 , 4};
        
        SelectSort<int>(array, 5);
        
        for(int i=0; i<5; i++)
        {
            cout<<array[i]<<endl;
        }
        
        char ca[] = {'b', 'c', 'a', 'e', 'd', 'f'};
        
        SelectSort(ca, 6);
        
        for(int i=0; i<6; i++)
        {
            cout<<ca[i]<<endl;
        }
        
        cout << "Press the enter key to continue ...";
        cin.get();
        return EXIT_SUCCESS;
    }

    三。函数模板与重载

      函数模板可以像普通函数一样被重载

      1.c++编译器优先考虑普通

      2.如果函数模板可以产生一个更好的匹配,那么选择模板

      3.可以通过空模板实参列表的语法限定编译器只通过模板匹配

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int Max(int a, int b)
    {
        cout<<"int Max(int a, int b)"<<endl;
        return a > b ? a : b;
    }
    
    template<typename T>
    T Max(T a, T b)
    {
        cout<<"T Max(T a, T b)"<<endl;
        return a > b ? a : b;
    }
    
    template<typename T>
    T Max(T a, T b, T c)
    {
        cout<<"T Max(T a, T b, T c)"<<endl;
        return Max(Max(a, b), c);
    }
    
    
    int main(int argc, char *argv[])
    {
        int a = 1;
        int b = 2;
        
        cout<<Max(a, b)<<endl;
        cout<<Max<>(a, b)<<endl;
        
        cout<<Max(3.0, 4.0)<<endl;
        
        cout<<Max(5.0, 6.0, 7.0)<<endl;
        
        cout<<Max('a', 100)<<endl;
        
        cout << "Press the enter key to continue ...";
        cin.get();
        return EXIT_SUCCESS;
    }

    四。注意事项

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    
    template<typename RT, typename T1, typename T2>
    RT Add(T1 a, T2 b)
    {
        return static_cast<RT>(a + b);
    }
    
    
    int main(int argc, char *argv[])
    {
        cout<<Add<double, char, float>('a', 100.0f)<<endl;
        cout<<Add<double>('a', 100.0f)<<endl;
        
        cout << "Press the enter key to continue ...";
        cin.get();
        return EXIT_SUCCESS;
    }

     1.函数模板不允许自动类型转化的

      2.普通函数能够进行自动类型转换

  • 相关阅读:
    protobuf 文档
    nodesass安装出错问题
    idea 部署docker
    cnpm报错 : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本
    开源镜像下载
    工具—idea
    Java 17 java.util.HashSet 类源码分析
    IDEA 使用@Autowired提示Field injection is not recommended
    6 MyBatis动态SQL之choose(when、otherwise)语句
    Java Set的五种遍历方式
  • 原文地址:https://www.cnblogs.com/lvxiaoning/p/7672545.html
Copyright © 2020-2023  润新知