C 函式模板的顯式具體化

2021-10-07 07:31:22 字數 1819 閱讀 7887

在c++中,我們可以使用函式模板來增加**的復用性,但是並不是所有的型別都可以呼叫函式函式模板來處理,如陣列和結構體資料型別。這就是函式模板的侷限性。

struct job

//交換兩個這種結構的內容,原來的模板使用以下**進行交換:

temp=a;

a=b;

b=temp;

由於c++允許將乙個結構賦給另乙個結構,因此即使t是job結構,上述**也適用。假設我們只想要交換salary和floor成員,而不交換name成員,則需要使用不同的**,但swap()的引數將保持不變,因此無法使用模板過載來提供其他的**。

我們可以提供乙個具體化函式定義——顯式具體化,其中包括所需**,當編譯器找到與函式呼叫匹配的具體化定義時,將使用該定義,不再尋找模板。

c++標準的定義形式:

1.對於給定的函式名,可以有非模板函式,模板函式和顯式具體化模板函式以及他們的過載版本。

2.顯式具體化的原型和定義應以template<>打頭,並通過名稱來指出型別。

2.具體化優先於常規模板,而非模板函式優先於具體化和常規模板。

下面是用於交換job結構的非模板函式、模板函式和具體化的原型:

//非模板函式

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