模板函式,模板函式過載,顯示具體化模板,例項化

2021-08-09 16:28:39 字數 1334 閱讀 3672

編譯器在選擇原型時,非模板版本函式優先於顯示具體化和模板版本函式,而顯示具體化優先於使用常規模板函式版本。

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...