活著就意味必須要做點什麼,請好好努力。模版是泛型程式設計的基礎, 模版分為 函式模版 和 類模版------《地下》
函式模板格式:
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 非型別模板引數
對於函式模板與類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體的細節來加以確定 直到 被呼叫時這些細節才被真正的確定。但是在這裡,我們面對的是這些細節是值,而不是型別,當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項化。在上篇文章 ...