在c++中,我們可以使用函式模板來增加**的復用性,但是並不是所有的型別都可以呼叫函式函式模板來處理,如陣列和結構體資料型別。這就是函式模板的侷限性。
struct job
//交換兩個這種結構的內容,原來的模板使用以下**進行交換:
temp=a;
a=b;
b=temp;
由於c++允許將乙個結構賦給另乙個結構,因此即使t是job結構,上述**也適用。假設我們只想要交換salary和floor成員,而不交換name成員,則需要使用不同的**,但swap()的引數將保持不變,因此無法使用模板過載來提供其他的**。
我們可以提供乙個具體化函式定義——顯式具體化,其中包括所需**,當編譯器找到與函式呼叫匹配的具體化定義時,將使用該定義,不再尋找模板。
c++標準的定義形式:
1.對於給定的函式名,可以有非模板函式,模板函式和顯式具體化模板函式以及他們的過載版本。下面是用於交換job結構的非模板函式、模板函式和具體化的原型:2.顯式具體化的原型和定義應以template<>打頭,並通過名稱來指出型別。
2.具體化優先於常規模板,而非模板函式優先於具體化和常規模板。
//非模板函式
void
swap
(job &a,job &b)
;//模板函式
template
<
typename t>
void
swap
(t &
,t &
)//顯式具體化
template
<
>
void swap
(job&
,job&
);
顯式具體化例項:
#include
using
namespace std;
template
<
typename t>
void
swap
(t& a, t& b)
;struct job
;template
<
>
void swap
(job& j1, job& j2)
;void
show
(job& j)
intmain()
; job jk =
; cout <<
"ja:"
;show
(ja)
; cout <<
"jk:"
;show
(jk)
;swap
(ja, jk)
; cout <<
"交換後:"
C 函式模板的顯式具體化
功能 c 模板的顯式具體化練習。常規模板 add加法模板,採用顯式具體化模板方式,具體化乙個複數相加的add函式。總結 顯式具體化是針對常規模板進行的,因此必須與常規模板的定義格式相符合。如下程式所示,除any型別可以用乙個具體化的c 型別 替換外,其它應該保持與常規模板一致,否則可能不能進行編譯 ...
C 函式模板的顯式具體化
我們知道可以利用函式模板來處理不同的資料型別,然而函式模板對於某些資料型別並不能處理,具有一定的侷限性。那麼應該如何解決該侷限性呢?例如經典的資料交換函式swap template typename t void swap t a,t b 我們可能希望利用上述的函式模板實現不同型別資料的交換,然而對...
C 模板顯式具體化
目錄 出品 coder梁 id coder lt 前文當中說mjwgjecfta了,模板函式雖然非常好用,但是也存在一些問題。比如有的操作並不是對所有型別都適用的,針對這種情況c 提供了乙個解決方案,就是針對特定型別提供具體化的模板定義。這裡的具體可以理解成型別的具體。我們來看乙個c primer當...