zoukankan      html  css  js  c++  java
  • c++之函数模板

    模板

      模板把函数或类要处理的数据类型参数化,表现为参数的多态

          性,称为类属。

      模板用于表达逻辑结构相同,但具体数据元素类型不同的数据

          对象的通用行为。

    什么是模板:

    类属 —— 类型参数化,又称参数模板

            使得程序(算法)可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递

    C++提供两种模板机制:  函数模板

                 类模板

    函数模板声明:

    template  < 类型形式参数表 >

    类型  函数名 ( 形式参数表 )

        {     语句序列

        }

       函数模板定义由模板说明和函数定义组成
       模板说明的类属参数必须在函数定义中至少出现一次
      函数参数表中可以使用类属类型参数,也可以使用一般类型参数 
    简单函数模板的应用:
     1 #include <iostream>
     2 using namespace std;
     3 
     4 //函数模板
     5 //模板说明
     6 template <typename T>
     7 //函数定义
     8 T Max(T a,T b)
     9 {
    10     return (a > b) ? a : b;
    11 }
    12 
    13 void main()
    14 {
    15     //程序执行时会匹配不用的版本
    16     cout << Max(5,20) << endl;
    17     cout << Max('t','e') << endl;
    18     cout << Max (3.4,5.2) << endl;
    19 }

    2.冒泡排序法的函数模板:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 template <typename ElementsType>    //模板声明
     5 void sortBubble(ElementsType* a,int size)    //类属参数和普通类型参数
     6 {
     7     //类属类型变量
     8     ElementsType temp;
     9 
    10     //冒泡排序算法
    11     for(int i=1;i<size;i++)
    12     {
    13         for(int j=0;j<size-i;j++)
    14         {
    15             if(a[j]>a[j+1])
    16             {
    17                 temp = a[j];
    18                 a[j] = a[j+1];
    19                 a[j+1] = temp;
    20             }
    21         }
    22     }
    23 }
    24 void main()
    25 {
    26     //把元素为char类型的数组和int类型的数组,当做实参传递,都能进行排序
    27     char a[]= {'b','e','a','c','d'};
    28     int b[] = {2,4,3,1,5};
    29     sortBubble(b,5);
    30     sortBubble(a,5);
    31     for(int i=0;i<5;i++)
    32     {
    33         cout << a[i] <<'	' << b[i] << endl;
    34     }
    35 }
    3.重载函数模板:
    有些特殊情况需要函数模板参与重载

    例如

      template < typename  T >

      T  max ( T  a , T  b )

        { return  a > b ? a : b ; }   

    void  f ( int  i , char  c )

     {  max ( i , i ) ;  // ok

         max ( c ,  c ) ;  // ok

         max ( i ,  c ) ;  // error,无法匹配

         max ( c ,  i ) ;  // error

      }

    重载函数模板之后:

    template < typename  T >

    T  max ( T  a , T  b )

      { return  a > b ? a : b ; }

    int  max ( int  a , char  b )  // 模板函数重载版本

      { return  a > b ? a : b ; }

    void  f ( int  i , char  c )

     {  max ( i , i ) ;  // ok

         max ( c ,  c ) ;  // ok

         max ( i ,  c ) ;    // ok ,由系统提供隐式转换

         max ( c ,  i ) ;    // ok

     }

     1 #include <iostream>
     2 using namespace std;
     3 
     4 //函数模板
     5 template <typename T>
     6 T Max(const T a,const T b)
     7 {
     8     return (a > b) ? a : b;
     9 }
    10 
    11 //重载函数模板
    12 template <typename T>
    13 T Max(const T a,const T b,const T c)
    14 {
    15     T t = max(a,b);
    16     return max(t,c);
    17 }
    18 
    19 //用普通类型重载函数模板
    20 int Max(const int a,const char c)
    21 {
    22     return (a > c) ? a : c;
    23 }
    24 void main()
    25 {
    26     cout << Max(5,12) << endl;
    27     cout << Max(6,'T') << endl;
    28     cout << Max(5,2,8) << endl;
    29 }

    4.函数重载模板的匹配约定:

       寻找和使用最符合函数名和参数类型的函数,若找到则调用它;
       否则,寻找一个函数模板,将其实例化产生一个匹配的模板函数,若找到

          则调用它;

       否则,寻找可以通过类型转换进行参数匹配的重载函数,若找到则调用它
       如果按以上步骤均未能找到匹配函数,则调用错误。
       如果调用有多于一个的匹配选择,则调用匹配出现二义性。
  • 相关阅读:
    【ansible】 笔记 (1)
    centos 把网卡名称修改为 eth0
    服务器从购买到交付使用流程
    (转载) Linux IO模式及 select、poll、epoll详解
    孤儿进程、僵尸进程和守护进程
    (转载)linux下各个文件夹的作用
    缓存穿透与缓存雪崩
    SpringCloud核心组件在微服务架构中的作用
    双十一电商Java开发聊聊秒杀限流的多种实现
    localhost 和 127.0.0.1 的区别
  • 原文地址:https://www.cnblogs.com/Smart-Du/p/4336077.html
Copyright © 2011-2022 走看看