C++入門經典-例9.1-函數模板,函數模板的作用,使用數組作為模板參數


1:函數模板不是一個實在的函數,因此編譯器不能為其生成可執行的代碼。定義函數模板只是一個對函數功能框架的描述,在具體執行時,將根據傳遞的實際參數決定其功能。

2:函數模板定義的一般形式如下:

template <類型形式參數> 返回類型 函數名(形式參數表)

{

   ...//函數實現

}

    其中template為關鍵字,表示定義一個模板,尖括號“<>”中為模板參數,模板參數主要有兩種,一種是模板類型參數,另一種是模板非類型參數。上述代碼中定義的模板使用的是模板類型參數,模板類型參數使用關鍵字class或typedef開始,其后是一個用戶自定義的合法標識符。模板非類型參數和普通參數定義相同,通常為一個常數。

    可以將聲明函數模板分成template部分和函數名部分。例如:

template <class T>

void fun(T t)

{

    ...//函數實現

}

    例如,下面的代碼定義了一個求和的函數模板:

template <class type>//定義一個模板類型

type Sum(type xvar,type yvar)

{

    return xvar+yvar;

}

    在定義完函數模板之后,需要在程序中調用函數模板。下面的代碼演示了Sum函數模板的調用。

int iret=Sum(10,20);//實現兩個整數的相加

double dret=Sum(10,20.5);//實現兩個實數的相加

    如果采用如下的形式調用Sum函數模板,將會出現錯誤。

int iret=Sum(10.5,20);//錯誤的調用

double dret=Sum(10,20.5);//錯誤的調用

    上述代碼中為函數模板傳遞了兩個類型不同的參數。導致編譯器產生了歧義。如果在調用函數模板時顯示表示模板類型就不會出現錯誤。例如:

int iret=Sum<int>(10.5,20);//正確地調用函數模板

double dret=Sum<double>(10,20.5);//正確地調用函數模板

    用函數模板生成實際可執行的函數又稱為模板函數。函數模板與模板函數不是一個概念。從本質上講,函數模板是一個“框架”,它不是真正可以編譯生成代碼的程序,而模板函數是把函數模板中的類型參數實例化后生成的函數,它和普通函數本質上是相同的,可以生成可執行代碼。

3:函數模板的作用

    假設求兩個函數之中的最大者,如果想求整形數和實型數,那么需要定義兩個函數,這兩個函數定義如下:

int max(int a,int b)

{

    return a>b?a:b;

}

float max(float a,float b)

{

    return a>b?a:b;

}

    如果想通過一個max函數來完成既求整型數之間最大者又求實型數之間的最大者,則可以使用函數模板和#define宏定義來實現。

    #define宏定義可以在預編譯期對代碼進行替換。例如:

#define max(a,b) ((a)>(b)?(a):(b))

    上述代碼可以求整數最大值和實型數最大值。但宏定義#define只是進行簡單替換,它無法對類型進行檢查,有時計算結果可能不是想要的。

    使用模板函數求最大值的代碼如下:

template<class Type>

Type max(Type a,Type b)

{

    if(a>b)

        return a;

    else

        return b;

}

    調用模板函數max可以分別正確地計算出整型數和實型數的最大值。例如:

cout<<“最大值:”<<max(10,1)<<endl;

cout<<“最大值:”<<max(200.05,100.4)<<endl;

4:使用數組作為模板函數,代碼如下:

 

// 9.1.cpp : 定義控制台應用程序的入口點。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
template <class type,int len>                //定義一個模板類型
type Max(type array[len])                    //定義函數模板
{
    type ret = array[0];                    //定義一個變量
    for(int i=1; i<len; i++)                    //遍歷數組元素
    {
        ret = (ret > array[i])? ret : array[i];    //比較數組元素大小
    }
    return ret;                            //返回最大值
}
void main()
{
    int array[5] = {1,2,3,4,5};                //定義一個整型數組
    int iret = Max<int,5>(array);            //調用函數模板Max
    double dset[3] = {10.5,11.2,9.8};        //定義實數數組
    double dret = Max<double,3>(dset);        //調用函數模板Max
    cout << dret << endl;
}
View Code

運行結果:

    程序中定義了一個函數模板Max,用來求數組中元素的最大值,其中,模板參數使用模板類型參數type和模板非類型參數len,參數type 聲明了數組中的元素類型,參數len聲明了數組中的元素個數,給定數組元素后,程序將數組中的最大值輸出。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM