c++中的模板(template),是泛型程式設計的基礎。乙個模板就是乙個藍圖,用來建立類或函式的藍圖。
模板主要分為兩類:
函式模板(function template)
類模板(class template)
本文主要介紹函式模板(function template)。
關於模板的全部內容,參考【c++深陷】之「模板」。
// 例1
template
<
typename t>
intcompare
(const t &v1,
const t &v2)
// 例2
template
<
unsigned n,
unsigned m>
intcmpchararr
(const
char
(&p1)
[n],
const
char
(&p2)
[m])
接下來認識名詞。
template
關鍵字是必須的。
<>
中的內容,稱為模板引數列表(template parameter list),包含多個由逗號,
分隔開的模板引數(template parameter),模擬函式的引數列表,注意不能為空。
模板引數分為兩類:
型別引數(type parameter):指定模板中的型別非型別引數(nontype parameter):指定模板中的定值型別引數可以看作不固定形態的型別說明符(4. 定義變數),如例1。我們可以和以往使用函式一樣使用函式模板:
cout <<
compare(1
,9)<< endl;
// t是int型別
上面的呼叫會在程式編譯階段進行模板的例項化(instantiate),告訴編譯器我的t
是型別int
,產生乙個形如下面的例項(instantiation):
int
compare
(const
int&v1,
const
int&v2)
;
這個感覺類似於函式的形參和實參,當我們在使用模板時,會傳遞給模板函式模板實參(template argument),即上例中編譯器根據1和9推斷出的t
為int
。
非型別引數是乙個值,需要用具體的型別來指定,如例2。當我們呼叫時:
cmpchararr
("hi"
,"template"
);
n
和m
分別被例項化為3和9,都是我們指定的unsigned int
型別:
int
cmpchararr
(const
char
(&p1)[3
],const
char
(&p2)[9
]);// 字元陣列末尾有乙個'\0'
此時我們發現,可以傳遞陣列給函式,且無需多指定陣列的維度。
用來例項化非型別整型引數的模板實參必須是常量表示式,可以是以下型別:
整型(沒有浮點型)
函式指標
指向具有靜態性的物件的指標
繫結到具有靜態性的物件的左值引用
此時我們發現,上述所有示例,我們並沒有在**中指定t
是什麼型別。這是因為當我們呼叫compare(1, 9)
時,編譯器進行了模板實參推斷(template argument deduction),它幫我們推斷出t
是int
。這種指定模板引數的方式稱為隱式模板實參(implicit template argument),在類模板中,我們會接觸到顯示模板實參(explicit template argument)。
函式模板可以宣告為inline或constexpr,放在template宣告之後。
template
關鍵字
模板引數列表(template parameter list)
模板引數(template parameter)
型別引數(type parameter)
非型別引數(nontype parameter)
例項化(instantiate)
例項(instantiation)
模板實參(template argument)
模板實參推斷(template argument deduction)
隱式模板實參(implicit template argument)
顯示模板實參(explicit template argument)
C 模板之函式模板
c 中分為函式模板和類模板,它們之間的相同點是都含有模板型參表,不同點在模板例項化的時候函式模板可以不用顯示的宣告模板類項,編譯器會自動幫我們匹配,而類模板則需要顯示定義出來,例如 template compare type type compare a,b template class queue...
C 模板之函式模板
泛型程式設計 編寫與型別無關的邏輯 是 復用的一種手段。模板是泛型程式設計的基礎 模板代表乙個函式家族,該函式與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本 它本身不是類或函式 模板函式的格式 模板的例項化 產生模板特定型別的過程稱為函式模板的例項化 template t add ...
c 之模板函式 模板
模板就是建立通用的模具,大大提高復用性。c 的另一種程式設計思想是泛型程式設計,主要利用的就是模板。c 提供兩種模板機制 函式模板和類模板。宣告 template typename可以替換成class 函式模板 函式模板的作用 建立乙個通用函式,其函式返回值型別和形參型別可以不具體制定,用乙個虛擬的...