函式模板是通用的函式的描述,也就是說它們使用泛型來定義函式,之中的泛型可以具體化為int,double等變數型別。通過將具體的型別作為引數傳入模板中,可以使編譯器生成該型別的函式。
基本型別
templatetypename functionname(anytype namea, ..., anytype namen);
第一行建立乙個模板,並將型別命名為anytype
.其中的關鍵字template
和typename
是必需的存在的(其中typename
可以用class
代替)。
模板並不會建立任何函式,他只是告訴編輯器如何定義函式。比如說當需要使用int
型別時,編輯器就會按照模板的格式建立該型別的函式,並且使用int
來代替模板中的anytype
。
#include
template
void swap(t &a, t &b);
int main()
template
void swap(t &a, t &b)
template
// 模板一
void swap(t &a, t &b);
template
// 模板二
void swap(t *a, t *b, int n);
templatet>
void f(t a,t b)
在該函式模板中,如果在**中存在賦值操作,而同時t被識別為陣列時,操作就不可進行。
template
// 模板一
void swap(t &a, t &b);
當我們想要進行兩個結構體的具體成員交換式,上述**並不能實現這樣的操作。這是我們可以提供乙個具體的函式定義——顯式具體化(可以將其當做原始模板的乙個具體化操作,當編輯器找到與函式呼叫相匹配的具體定義時,將跳過函式模板使用該具體定義。)
- 第三方具體化
//(job為乙個結構體)
void swap(job &, job &);
//非模板函式
template
void swap(t &,t &);
//模板函式
template
<> void swap(job &,job &);
//具體化
編輯器則是通過具體的需要來選擇函式。比如
int a=10,b=20
;swap(a,b);//使用模板函式
job a,b;
swap(a,b);//使用具體化
具體案列
#include
template
void swap(t &a, t &b);
struct job
;// explicit specialization
template
<> void swap(job &j1, job &j2);
int main()
; job sidney = ;
cout
show(sue);
show(sidney);
swap(sue, sidney); // uses void swap(job &, job &)
cout
show(sue);
show(sidney);
return0;}
template
void swap(t &a, t &b)
template
<> void swap(job &j1, job &j2) // specialization
...
template
void swap(t &,t &);
template
<> void swap(job &,job &);
int main()
c 函式模板
include using namespace std template t max t a,t b,t c int main int main int i1 185,i2 76,i3 567,i double d1 56.63,d2 90.23,d3 3214.78,d long g1 67854...
c 函式模板
關鍵字template總是放在模板的電腦關於與宣告的最前面,關鍵字後面是用逗號分隔的模板參數列,該列表是模板參數列,不能為空。模板引數可以是乙個模板型別引數,它代表了一種型別 也可以是乙個模板非型別引數,它代表了乙個常量表示式。模板型別引數由關鍵字class或typename後加乙個識別符號構成。在...
C 函式模板
c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...