模板
模板是c++的一種特性,允許函式或類(物件),通過泛型的形式表現或執行
模板可以使函式或類在對應不同的型別的時候正常工作,無需為每乙個型別都寫乙份**
兩種模板
類模板:使用泛型引數的類
函式模板:使用泛型引數的函式
模板例項化
模板的宣告其實並未給出乙個函式或類的完全定義,只是提供了乙個函式或類的語法框架
例項化是從模板構建出乙個真正的函式或類的過程
有兩種型別:
顯示例項化:在**中明確指定要針對哪種型別進行s例項化
隱式例項化:在首次使用時根據具體情況使用一種合適的型別進行例項化
add <
int>(1
+2);
//隱式
add<
char
>
('a'
,'b'
)//顯式
函式模板
函式模板是引數化的一族函式
通過函式模板,可以定義一系列函式,這些函式都基於同一套**,但是可以作用在不同型別的引數上
例子
template
<
typename t>
//模板的定義
t add
( t a, t b)
//模板的定義必須要和函式模板在一起
//定義了add函式模板,其中傳參為t,返回值為t
intmain()
對於不同的型別,都從模板例項出不同的形體
我們對他進行兩次呼叫,分別進行不同的傳參,他就有不同的表現形式,比如傳入是int,就是int,傳入char就是char
例項化:用具體的型別代替模板引數t的過程就叫例項化,從而產生乙個模板例項結論
模板被編譯了兩次
沒有例項化之前,檢查模板**本身是否有語法錯誤
例項化期間,檢查模板的呼叫是否合法
引數推導
模板引數是有傳遞給模板函式的實參決定的
不允許自動型別轉換,每個t必須嚴格匹配
add (1,
2);//yes
add (1,
2.3)
;//error
add (
'a',2)
;//error
函式模板過載
函式模板也可以像普通函式一樣過載
非模板函式可以和同名模板函式共存
編譯器通過函式模板引數推導來決定使用呼叫哪個過載
template
<
typename t,
typename t_1>
t_1 add
( t a, t b)
template
<
typename t>
void
add(t a, t b)
void
add(
int a,
int b)
intmain()
{int a =
2, b =2;
add(1,
2);//優先呼叫函式
add<
int>(1
,2);
//呼叫函式模板需要顯示呼叫
add<
int,
int>(1
,2)//有返回值的函式模板需要顯式呼叫
總結
對於不同的實參型別,函式模板定義了一組函式
當傳遞模板實參的時候,函式模板依據實參的型別進行例項化
可以顯式指定模板實參型別
函式模板可以過載
當過載函式模板的時候,將改變限制在:顯示指定模板引數
函式模板和模板函式
1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...
函式模板和模板函式
1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...
函式模板和模板函式
1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...