C 中的模板總結

2021-10-24 16:11:32 字數 3813 閱讀 5885

對於過載函式來說,c++的檢查機制能夠通過引數和所屬類的不同去呼叫不同的過載函式,例如,當我們需要求兩數最大值時,定義man()函式的不同過載版本

int

max(

int x ,

int y)

float

max(

float x ,

float y)

但是如果在main函式中,定義了double x,y,執行max(x,y);時,就會報錯,因為沒有定義double型別的過載函式。所以如何避免因過載函式定義的不全面而帶來的呼叫錯誤?c++引入了模板來解決這個問題。

模板定義:模板就是實現**重用機制的一種工具,它可以實現型別引數化,即把型別定義為引數, 從而實現了真正的**可重用性。

模版分為:函式模版和類模版。

函式模板概念:函式模板代表了乙個家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本

函式模板原理:函式模板本身並不是函式,是編譯器根據使用方式產生特定具體型別函式的模具,編譯器通過模板例項出對應的函式或者類(在編譯階段,編譯器通過對實參型別來生成對應型別的函式

函式模板格式:template

template

<

typename t>

//typename是用來定義模板引數關鍵字,也可以使用class

t add

(const t& left,

const t& right)

//返回型別 函式名(引數){}

函式模板的例項化

1.函式模板的隱式例項化

template

<

class

t>

t add

(const t& left,

const t& right)

intmain()

2.函式模板的顯式例項化

int

main

(void

)

模板引數的匹配規則

1.乙個非模板函式可以和乙個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式

2.對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模板產生出乙個例項。如果模板可以產生乙個具有更好匹配的函式, 那麼將選擇模板

3.模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換

類模板定義格式

template

<

classt1,

classt2,

...>

//template

class 類模板名

;

//在類test中宣告兩個型別為t的成員變數a和b,和乙個返回型別為t的函式test_1

template

<

class

t>

class

test

;//注意:類模板中函式放在類外進行定義時,需要加模板引數列表

template

<

class

t>

test

::test_1()

注意:此時test不是具體的類,而是編譯器根據被例項化的型別生成具體類的模具

類模板的例項化:類模板例項化需要在類模板的名字後面跟<>,將例項化的型別放在<>中,類模板名字不是真正的類,例項化的結果是真正的類

//test是類名,test是型別 

test<

int> s1;

模板引數分為型別形參和非型別形參

1.型別形參:在模板引數列表中,跟在class和typename之類的引數名稱

2.非型別形參:用乙個常量作為類(函式)模板的乙個引數,在類(函式)模板中可將該引數當成常量

注意:浮點數,類物件,字串不允許作為非型別模板引數

非型別的模板引數必須在編譯器就能確認結果

什麼是模板特化:在原模板類的基礎上,針對特殊型別所進行特殊化的實現方式,分為函式模板特化和類模板特化

函式模板特化

特化部驟

1.必須先存在乙個基礎的函式模板

2.關鍵字template後面接一對空尖括號 <>

3.函式名後面跟一對尖括號,尖括號中指定需要特化的型別

4.函式形參表:必須要和模板函式的基礎引數型別完全相同,不同則報錯

template

<

class

t>

bool

max(t& left, t& right)

//函式模板特化

template

<

>

bool max<

int*

>

(int

*& left,

int*

& right)

類模板特化

1.全特化:將模板引數列表中所有的引數確定化

template

<

classt1,

class

t2>

class

aprivate

: t1 a;

t2 b;

}//類模板全特化

template

<

>

class

a<

int,

char

>

private

: t1 a;

t2 b;

}

2.偏特化:針對模板引數進一步進行條件限制

部分特化

//將第二個引數特化為int

template

<

class

t1>

class

aint>

private

: t1 a;

t2 b;

}

進一步限制

//將兩個引數特化為指標型別

template

<

typename t1,

typename t2>

class

a, t2*

>

private

: t1 a;

t2 b;

}

模板優缺點

優點:1.模板復用了**,節省資源,更快迭代開發

2.增強了**的復用性

缺點:1.模板會導致**膨脹問題,導致編譯時間變長

2.模板編譯錯誤資訊混亂,不易定位錯誤

C 模板總結

1 模板概念 模板是泛型程式設計的基礎。所謂泛型程式設計就是編寫與型別無關的邏輯 是一種復用的方式。模板分為模板函式和模板類。2 typename 與 class template 採用 class 來宣告模板 class template 採用 typename 來宣告模板 class 這兩種一般...

C 模板總結

前提 我們要實現乙個通用的交換函式swap,就是讓它適用於任何乙個型別。比如 int,char,double.但是我們要寫很多交換的函式,對swap函式進行過載。那我們如何解決這個問題?可不可以給編譯器乙個模子,讓編譯器來給我們實現不同型別的轉化?1.概念 函式模板代表了乙個函式家族,在使用時被引數...

C 類模板的總結

模板類是乙個很有用的工具,平常使用比較多的像std vector,std map,std queue都是模板類,可以說很方便.但是背後的實現可以說是很複雜,包括記憶體分配,包括快速訪問.我們之所以能這麼方便的使用,全是站在了巨人的肩膀上.模板定義的c 實體如下 本文主要介紹類模板和函式模板,首先我們...