溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

C++模版函數(shù)怎么用

發(fā)布時(shí)間:2021-11-24 13:40:16 來(lái)源:億速云 閱讀:163 作者:小新 欄目:網(wǎng)絡(luò)安全

這篇文章給大家分享的是有關(guān)C++模版函數(shù)怎么用的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

C++中的模版總體可以分為兩大類(lèi):模版函數(shù)、模版類(lèi)。本篇文章先寫(xiě)模版函數(shù),接下來(lái)會(huì)介紹模版類(lèi)。

定義:模版函數(shù)是通用的函數(shù)描述,也就是說(shuō)它們使用通用類(lèi)型來(lái)定義,其中的通用類(lèi)型可用具體類(lèi)型替換。

代碼實(shí)例:

#include <iostream>//模版函數(shù)的聲明template<typename T>void Swap(T& a,T& b);int main()
{    int i = 10;    int j = 20;
    std::cout<<"i=" << i << "," << "j=" <<j;
    Swap(i,j);//生成 void Swap(int &,int&);
    std::cout<<"i=" << i << "," << "j=" <<j;    double x = 11.5;    double y = 19.5;
    std::cout<<"x=" << x << "," << "y=" <<y;
    Swap(x,y);//編譯器生成 void Swap(double &,double&);
    std::cout<<"x=" << x << "," << "y=" <<y;    return 0;
}//模版函數(shù)的定義template<typename T>void Swap(T& a,T& b)
{
    T temp;
    temp = a;
    a = b;
    b = temp;
}

以上實(shí)例為最簡(jiǎn)單的函數(shù)模版實(shí)例,編譯器會(huì)根據(jù)具體使用的類(lèi)型生成相對(duì)應(yīng)的函數(shù)。

重載的模版:

需要多個(gè)對(duì)不同的類(lèi)型使用同一算法時(shí)可使用模版,如上代碼所示。但是并非所有的類(lèi)型都使用相同的算法。為滿(mǎn)足這種需求,可以像重載常規(guī)函數(shù)定義那樣重載模版定義。和重載常規(guī)函數(shù)一樣,重載函數(shù)的特征表必須不同。代碼實(shí)例如下:

#include <iostream>//模版函數(shù)的聲明template<typename T>void Swap(T& a,T& b);const int iCount = 5;
template<typename T>void Swap(T* a,T*b,int n);int main()
{    int i = 10;    int j = 20;
    std::cout<<"i=" << i << "," << "j=" <<j;
    Swap(i,j);//生成 void Swap(int &,int&)
    std::cout<<"i=" << i << "," << "j=" <<j;    double x = 11.5;    double y = 19.5;
    std::cout<<"x=" << x << "," << "y=" <<y;
    Swap(x,y);//編譯器生成 void Swap(double &,double&);
    std::cout<<"x=" << x << "," << "y=" <<y;    int d[iCount] = {0,1,2,3,4};    int e[iCount] = {5,6,7,8,9};
    Swap(d,e,iCount);//匹配新的模版,進(jìn)行數(shù)組的交換

    return 0;
}//模版函數(shù)的定義template<typename T>void Swap(T& a,T& b)
{
    T temp;
    temp = a;
    a = b;
    b = temp;
}

template<typename T>void Swap(T* a,T*b,int n)
{    for (int i=0;i<iCount;++i)
    {
        T temp;
        temp = a[i];
        a[i] = b[i];
        b[i] = temp;
    }
}

如上代碼新增了一個(gè)模版,用于交換兩個(gè)數(shù)組中的元素,原來(lái)的模版特征標(biāo)為(T&,T&),新模版的特征標(biāo)為(T[],T[]),int)。注意,在后一個(gè)模版中,最后一個(gè)參數(shù)的類(lèi)型為具體類(lèi)型(int),而不是通用類(lèi)型,并非所有的模版參數(shù)都必須是模版參數(shù)類(lèi)型。

顯示具體化:

  • 對(duì)于給定的函數(shù)名,可以有非模版函數(shù),模版函數(shù)和顯示具體化模版函數(shù)以及它們的重載版本。

  • 顯示具體化的原型和定義應(yīng)該以template<>打頭,并通過(guò)名稱(chēng)來(lái)指出類(lèi)型。

  • 具體化將覆蓋常規(guī)模版,而非模版函數(shù)將覆蓋具體化和常規(guī)模版。

下面是用于交換Job結(jié)構(gòu)的非模版函數(shù),模版函數(shù)和具體化的原型。

void Swap(job &,job&);//非模版函數(shù)

template <typename T>

void Swap(T&,T&);//模版函數(shù)

template <> void Swap<job>(job&,job&);//顯示具體化函數(shù),其中Swap后的job參數(shù)可去掉,則函數(shù)簽名為template <> void Swap(job&,job&);

前面指出,如果有多個(gè)原型,編譯器在選擇原型時(shí),非模版將優(yōu)先于顯示具體化和模版版本,而顯示具體化將優(yōu)先于使用模版生成的版本。

如下面的調(diào)用:

double u,v;

Swap(u,v);//使用通用的模版

job a,b;

swap (a,b)//使用顯示具體化版本。

實(shí)例化和具體化:

    為了進(jìn)一步了解模版,必須理解術(shù)語(yǔ)實(shí)例化和具體化。記住,在代碼中包含函數(shù)模版本身并不會(huì)生成函數(shù)的定義,它只是一個(gè)用于生成函數(shù)定義的方案。編譯器使用模版為特定類(lèi)型生成定義時(shí),得到的是模版實(shí)例(instantiation)。例如:函數(shù)調(diào)用Swap(i,j),使編譯器生成一個(gè)Swap()的一個(gè)實(shí)例,該實(shí)例使用int類(lèi)型。模版并非函數(shù)定義,但使用int的模版實(shí)例是函數(shù)定義。這種實(shí)例化方式被稱(chēng)為隱式實(shí)例化,因?yàn)榫幾g器之所以知道需要定義,是由于程序調(diào)用Swap()時(shí)提供了int參數(shù)。

    現(xiàn)在編譯器還可以允許顯示實(shí)例化,這意味著可以直接命令編譯器生成特定的實(shí)例,如Swap<int>。其句法是,聲明所選的種類(lèi)-用<>符號(hào)指示類(lèi)型,并在聲明前加上關(guān)鍵字template:

template void Swap<int>(int,int);//顯示實(shí)例化

實(shí)現(xiàn)了這種特性的編譯器在看到上述聲明后,將使用Swap()模版生成一個(gè)int類(lèi)型的實(shí)例。

與顯示實(shí)例化不同的是,顯示具體化使用下面兩個(gè)等價(jià)聲明的之一:

template <> void Swap<int>(int,int);

template <> void Swap(int,int);

區(qū)別在于,這些聲明的意思是”不要使用Swap()模版來(lái)生成函數(shù)定義,而應(yīng)該使用獨(dú)立的、專(zhuān)門(mén)的函數(shù)定義顯示為int類(lèi)型生成函數(shù)定義。

注意:試圖在一個(gè)編程單元中使用同一種類(lèi)型的顯示具體化與顯示實(shí)例化將出錯(cuò)。

感謝各位的閱讀!關(guān)于“C++模版函數(shù)怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI