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] <<'\t' << 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.函数重载模板的匹配约定:

 

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

      则调用它;

   否则,寻找可以通过类型转换进行参数匹配的重载函数,若找到则调用它
   如果按以上步骤均未能找到匹配函数,则调用错误。
   如果调用有多于一个的匹配选择,则调用匹配出现二义性。
posted @ 2015-03-13 21:38  溈鉨wo乄菰単  阅读(113)  评论(0编辑  收藏  举报