C++模板的特化超詳細(xì)精講_第1頁
C++模板的特化超詳細(xì)精講_第2頁
C++模板的特化超詳細(xì)精講_第3頁
C++模板的特化超詳細(xì)精講_第4頁
C++模板的特化超詳細(xì)精講_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第C++模板的特化超詳細(xì)精講目錄一、泛型編程二、函數(shù)模板2.1、函數(shù)模板的概念2.2、函數(shù)模板的格式2.3、函數(shù)模板的原理2.4、函數(shù)模板的實例化2.4.1、隱式實例化2.4.2、顯示實例化三、類模板3.1、類模板的定義格式3.1、類模板的實例化四、模板的特化4.1、概念4.2、函數(shù)模板特化步驟4.3、類模板的特化4.3.1、全特化4.3.2、偏特化

一、泛型編程

我們前面已經(jīng)學(xué)過函數(shù)的重載,實現(xiàn)了在函數(shù)名相同的情況下,實現(xiàn)不同的功能!

例如:

voidSwap(intleft,intright)

inttemp=left;

left=right;

right=temp;

voidSwap(doubleleft,doubleright)

doubletemp=left;

left=right;

right=temp;

voidSwap(charleft,charright)

chartemp=left;

left=right;

right=temp;

}

利用函數(shù)重載雖然實現(xiàn)了通用的交換函數(shù),但是會有以下問題:

重載的函數(shù)僅僅是類型不同,代碼復(fù)用率低,只要有新的類型時,有需要用戶自己增加新的重載函數(shù)。代碼的可維護性低,一個出錯可能所有的重載都出錯。

??????:在C++中是否存在一個模具,通過給這個模具中填充不同的材料(類型),來獲得不同的鑄件(即生成具體的代碼)。

泛型編程:編寫與類型無關(guān)的通用代碼,是代碼復(fù)用的一種的手段。模板是泛型編程的基礎(chǔ)。

二、函數(shù)模板

2.1、函數(shù)模板的概念

函數(shù)模板代表了一個函數(shù)家族,該函數(shù)模板與類型無關(guān),在使用時被參數(shù)化,根據(jù)實參類型產(chǎn)生函數(shù)的特定類型版本。

2.2、函數(shù)模板的格式

templatetypenameT1,typenameT2,,typenameTn

返回值類型函數(shù)名(參數(shù)列表){}

templatetypenameT

voidSwap(Tleft,Tright)

Ttemp=left;

left=right;

right=temp;

??注意:typename是用來定義函數(shù)模板參數(shù)關(guān)鍵字的,也可以用class,但是不可以用struct。

2.3、函數(shù)模板的原理

函數(shù)模板我們可以理解為一個藍(lán)圖,它本身并不是函數(shù),在編譯器編譯階段根據(jù)傳入的實參類型來推演生成對應(yīng)類型的函數(shù)以供調(diào)用,也叫做函數(shù)模板的實例化。

2.4、函數(shù)模板的實例化

用不同類型的對象使用函數(shù)模板時,稱為函數(shù)模板的實例化。模板參數(shù)實例化分為隱式實例化和顯示實例化。

2.4.1、隱式實例化

讓編譯器根據(jù)實參推演模板參數(shù)的實際類型。

templateclassT

TAdd(constTleft,constTright)

returnleft+right;

intmain(){

inta1=10,a2=20;

doubled1=10.0,d2=20.0;

Add(a1,a2);

Add(d1,d2);

//Add(a1,d1);

Add(a1,(int)d1);

system("pause");

return0;

}

2.4.2、顯示實例化

讓函數(shù)名后的中指定模板參數(shù)的實際類型。

intmain(){

inta=10;

doubleb=20.0;

//Add(a,(int)b);//隱式

Addint(a,b);//顯示

system("pause");

return0;

Add(a,b);目的在于如果類型不匹配,編譯器會嘗試進行隱式類型轉(zhuǎn)換,如果無法轉(zhuǎn)換成功編譯器將會報錯。

三、類模板

3.1、類模板的定義格式

templatetypenameT1,typenameT2,,typenameTn

class類模板名

{

//類內(nèi)成員

};

3.1、類模板的實例化

類模板實例化與函數(shù)模板實例化不同,類模板實例化傳的是類型,而函數(shù)模板實例化傳的是對象,類模板實例化需要在類模板名字后面跟上,然后將實例化類型放在中即可!

vectorint

??:與普通類不同,這里vector是類名,而vector才是類型。

四、模板的特化

4.1、概念

通常情況下,我們使用模板可以實現(xiàn)一些與類型無關(guān)的代碼,但是對于一些特殊類型可能會得到一些錯誤的結(jié)果,需要特殊處理。

templateclassT

boolLess(Tleft,Tright){

returnleftright;

template

boolLessDate*(Date*p1,Date*p2)

cout"調(diào)用的模板函數(shù)的特化"endl;

return*p1*p2;

//只要是指針都可以調(diào)用這個,這個思想很重要

//偏特化的帶限制條件(指針類型可調(diào))

templateclassT

boolLess(T*left,T*right)

cout"調(diào)用的函數(shù)模板"endl;

return*left*right;

}

代碼解釋:當(dāng)我們在實參部分傳的是Date型指針的時候,如果不特化處理,結(jié)果會出錯。

上述就是在原模板的基礎(chǔ)上針對特殊類型所進行特殊化的實現(xiàn)方式。模板特化中分為函數(shù)模板特化和類模板特化。

4.2、函數(shù)模板特化步驟

必須要先有一個基礎(chǔ)的函數(shù)模板。關(guān)鍵字template后面接一隊空的。函數(shù)名后跟一對,尖括號中指定需要特化的類型。函數(shù)形參表:必須要和模板函數(shù)的基礎(chǔ)參數(shù)類型完全相同,如果不同編譯器可能會報一些奇怪的錯誤。

templateclassT

boolLess(Tleft,Tright){

returnleftright;

template

boolLessDate*(Date*p1,Date*p2)

cout"調(diào)用的模板函數(shù)的特化"endl;

return*p1*p2;

4.3、類模板的特化

4.3.1、全特化

全特化就是將模板參數(shù)中所有的參數(shù)都確定化

//類模板

templateclassT1,classT2

classdata

public:

data(T1a,T2b)

:_a(a)

,_b(b)

cout"dataT1,T2"endl;

private:

T1_a;

T2_b;

//全特化

template

classdataint,char

public:

data(inta,charb)

:_a(a)

,_b(b)

cout"全特化dataint,char"endl;

private:

int_a;

char_b;

intmain()

dataint,ints1(1,2);

dataint,chars2(1,'a');

}

4.3.2、偏特化

偏特化:任何針對模板參數(shù)進一步進行條件限制設(shè)計的特化版本。比如對一下類模板:

//類模板

templateclassT1,classT2

classdata{

public:

data(T1a,T2b)

:_a(a)

,_b(b)

cout"dataT1,T2"endl;

private:

T1_a;

T2_b;

};

??????偏特化有以下兩種變現(xiàn)方式:

部分特化:將模板參數(shù)中的一部分參數(shù)特化

//半特化

//1、將模板參數(shù)類表中的一部分參數(shù)特化。

templateclassT1

classdataT1,char{

public:

data(T1a,charb)

:_a(a)

,_b(b)

cout"偏特化dataT1,char"endl;

private:

T1_a;

char_b;

};

參數(shù)進一步限制:偏特化并不僅僅是指特化部分參數(shù),而是針對模板參數(shù)更進一步的條件限制所設(shè)計出來的特化版本。

//2、偏特化并不僅僅是指特化部分參數(shù),而是針對模板參數(shù)更進一步的條件限制所設(shè)計出來的一個特化版本。

templateclassT1,classT2

classdataT1*,T2*{

public:

data(T1a,charb)

:_a(a)

,_b(b)

cout"DataT1*,T2*"endl;

private:

T1_a;

T2_b;

templateclassT1,classT2

classdataT1,T2

public:

data(constT1a,constT2b)

:_a(a)

,_b(b)

{cout"DataT1,T2"en

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論