模板 一 模板與非型別模板引數 模板的模板引數

2021-08-20 02:23:24 字數 4165 閱讀 8538

活著就意味必須要做點什麼,請好好努力。

------《地下》

模版是泛型程式設計的基礎, 模版分為 函式模版 和 類模版

函式模板格式:

template <

class

(或typename) 形參名1

, class 形參名2

, class 形參名n>

返回型別 函式名(引數列表)

模板形參的定義既可以使用class,也可以使用typename,含義是相同的.

//乙個簡單的函式模板,比較 left 和 right, 與型別無關

模板引數匹配及顯示例項化

template 

bool isequal (

const t& left ,

const t& right )

void test1 (

)

過載函式模板

bool isequal (

const

int& left ,

const

int& right)

template

<

typename t>

bool isequal (

const t& left ,

const t& right )

template

<

typename t1,

typename t2>

bool isequal (

const t1& left ,

const t2& right)

void test1 (

)

函式會 優先呼叫 最適合自己的函式函式模板過載四大規則

函式模板可以像普通函式一樣被過載

c++編譯器優先考慮普通函式

如果函式模板可以產生乙個更好的匹配,那麼選擇模板

可以通過空模板實參列表<>的語法限定編譯器只通過模板匹配

類模版格式:

template

<

class 形參名1

,class 形參名2,.

..class 形參名n>

class 類名

模板類例項

//動態順序表

模板類的例項化

類模板是用來生成類的藍圖的。

與函式模板的不同之處是:編譯器不能為類模板推斷模板引數型別。為了使用類模板,我們必須在模板名後的尖括號中提供額外資訊——用來代替模板引數的模板實參列表。

##非型別模板引數&模板的模板引數

####模板引數–實現容器介面卡

template class seqlist

;// template template > // 預設引數

class stack

;void test ()

####模板的模板引數–容器介面卡

template

<

typename t>

class

seqlist

;// template class container>

template

<

classt,

template

<

class

>

class

container

= seqlist >

// 預設引數

####非型別的類模板引數

// 靜態順序表

//template

template

<

typename t, size_t max_size =

10>

//帶預設模板引數

class

seqlist

;template

<

typename t, size_t max_size>

seqlist

::seqlist ():

_size(0

)void test (

)

####非型別的模板函式引數

template t add (const t& x )

浮點數和類物件是不允許作為非型別模板引數的

//template//error

template //error

class test

;

補充:c++ 中 typename 和 class 的區別

在 c++ template 中很多地方都用到了 typename 與 class 這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢?

相信學習 c++ 的人對 class 這個關鍵字都非常明白,class 用於定義類,在模板引入 c++ 後,最初定義模板的方法為:

template

<

class

t>..

....

這裡 class 關鍵字表明t是乙個型別,後來為了避免 class 在這兩個地方的使用可能給人帶來混淆,所以引入了 typename 這個關鍵字,它的作用同 class 一樣表明後面的符號為乙個型別,這樣在定義模板的時候就可以使用下面的方式了:

template

....

..

在模板定義語法中關鍵字 class 與 typename 的作用完全一樣。

typename 難道僅僅在模板定義中起作用嗎?其實不是這樣,typename 另外乙個作用為:使用巢狀依賴型別(nested depended name),如下所示:

class

myarray

template

<

class

t>

void

mymethod

( t myarr )

這個時候 typename 的作用就是告訴 c++ 編譯器,typename 後面的字串為乙個型別名稱,而不是成員函式或者成員變數,這個時候如果前面沒有 typename,編譯器沒有任何辦法知道 t::lengthtype 是乙個型別還是乙個成員名稱(靜態資料成員或者靜態函式),所以編譯不能夠通過。

模板(二):模板的特化與模板的分離編譯

模板(三):模板之型別萃取(typetraits)

非型別模板引數

這是 c templates 第四章的學習筆記。這一章和下一章可以看作是對前面介紹的函式模板和類模板的補充。這章的主要內容包括 非型別的類模板引數。非型別的函式模板引數。非型別模板引數的限制。在具體介紹以前有比較說明一下什麼是非型別的模板引數。在前面簡單介紹函式模板和類模板的時候,我們都再三說明,模...

模板筆記4 非型別模板引數

include include include template template 可以指定預設值!class stack bool full const template stack stack numelems 0 template void stack push t const elem el...

C 非型別模板引數

對於函式模板與類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體的細節來加以確定 直到 被呼叫時這些細節才被真正的確定。但是在這裡,我們面對的是這些細節是值,而不是型別,當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項化。在上篇文章 ...