編譯器在選擇原型時,非模板版本函式優先於顯示具體化和模板版本函式,而顯示具體化優先於使用常規模板函式版本。
1 函式模板
宣告與定義時均需加上template 說明為函式模板。
eg . template
declaration:eg.template void swap(t & a1 ,t & a2) ; 函式模板宣告。
definition : template void swap( t &a1 ,t & a2)
definition : template void swap( t &a1 ,t & a2)
2 模板函式過載版本。
3顯示具體化模板函式 以 template <> 打頭
template <> void swap(job & ,job &)
其中是可選的,即可寫成
template <> void swap(job & ,job &)
job可為某種類
在**中包含函式模板本身不會生成函式定義,它只是乙個用於生成函式定義的方案。編譯器使用模板為特定型別生成函式定義時(即使用具體型別的引數來呼叫模板函式時),得到的是模板例項,模板並非函式定義,但使用具體型別的模板例項是函式定義。這種例項化方式為隱式例項化。
c++也允許顯式例項化。即提前指明型別。並在前面加上template。
template void swap(int ,int ) ; 顯式例項化。
template <> void swap(int , int ) 顯式具體化。
在同乙個檔案中使用同一種型別的顯示例項化和顯示具體化將出錯。
c++11新特性
template
void ft(t1 x ,t2 y)
1.因為不知道x+y的型別,所以c++11 引入了decltype
decltype(x) y , 讓y和x的型別一致。
即上面的模板函式可以, decltype(x+y) xpy ; xpy = x+y ; 或者 decltype (x+y) xpy=x+y ;
2.template
?type? gt(t1 x , t2 y)
返回型別是decltype(x+y),但是此時還未宣告引數x,y,它們不在作用域內,所以c++引入了後置返回型別。
上面函式可以改為
auto gt(t1 x ,t2 y) -> decltype(x+y)
舉例:
auto h(float x ,float y) -> double ; 也可直接指明型別
C 函式模板的具體化
一 函式模板的具體化 先看看c 98裡面有關具體化方法的標註 在函式模板中會有三個常見形式 隱式例項化 顯式例項化 顯式具體化 特殊化 1 隱式例項化即常規的模板函式,宣告以後它只是生成乙個模板並不會生成函式定義。編譯器接受乙個特定型別為函式生成定義,如下方程式清單中的swap i,j 這種和例項化...
函式模板與類模板的具體化
在 c primer 一書中,函式模板的具體化包括了三個部分 顯式具體化,隱式例項化與顯式例項化。1.隱式例項化 隱式例項化是我們最常見的型別 根據定義的通用函式模板,編譯器按照呼叫的引數生成特定的模板。如有以下的模板定義 template void myswap t a,t b 在其後的 塊中,如...
C 函式模板 模板例項化 具體化
函式模板是c 新增的一種性質,它允許只定義一次函式的實現,即可使用不同型別的引數來呼叫該函式。這樣做可以減小 的書寫的複雜度,同時也便於修改 注 使用模板函式並不會減少最終可執行程式的大小,因為在呼叫模板函式時,編譯器都根據呼叫時的引數型別進行了相應例項化 下面來看看函式模板的使用過程 struct...