C 函式模板的顯式具體化

2021-09-03 06:57:09 字數 878 閱讀 2078

我們知道可以利用函式模板來處理不同的資料型別,然而函式模板對於某些資料型別並不能處理,具有一定的侷限性。那麼應該如何解決該侷限性呢?

例如經典的資料交換函式swap

template

<

typename t>

void

swap

(t &a, t &b)

我們可能希望利用上述的函式模板實現不同型別資料的交換,然而對於數組合結構體資料型別,以上函式模板並不能使用。那麼應該如何解決這個問題呢?

利用對函式模板的顯式具體化,可以解決以上問題,即明確指出哪種資料型別另外採用某一種具體化的其他方法。

假設定義了如下結構體:

struct job

現在希望交換兩個這種結構體的內容,原來swap函式模板中的**雖然也適用,因為c++允許將乙個結構體賦給另外乙個結構體。然而,如只想交換salary和floor成員,而不交換name成員,則需要使用不同的**,但swap函式的引數將保持不變,因此無法使用模板過載來提供其他**。

這裡,可以提供乙個具體化函式定義,稱之為顯式具體化,其中包含所需的**。當編譯器找到與函式呼叫匹配的具體化定義時,將使用該定義,而不再繼續尋找模板。

c++98標準選擇了下面的具體化方法。其原型和定義以template<>開頭,並通過名稱指出型別。函式呼叫優先順序是 非模板函式》具體化模板函式》常規模板函式。

針對上述需求,可以針對只交換結構體某個內容編寫顯式具體化**,如下:

template

<

>

void swap

(job &j1,

&job &j2)

C 函式模板的顯式具體化

功能 c 模板的顯式具體化練習。常規模板 add加法模板,採用顯式具體化模板方式,具體化乙個複數相加的add函式。總結 顯式具體化是針對常規模板進行的,因此必須與常規模板的定義格式相符合。如下程式所示,除any型別可以用乙個具體化的c 型別 替換外,其它應該保持與常規模板一致,否則可能不能進行編譯 ...

C 函式模板的顯式具體化

在c 中,我們可以使用函式模板來增加 的復用性,但是並不是所有的型別都可以呼叫函式函式模板來處理,如陣列和結構體資料型別。這就是函式模板的侷限性。struct job 交換兩個這種結構的內容,原來的模板使用以下 進行交換 temp a a b b temp 由於c 允許將乙個結構賦給另乙個結構,因此...

C 模板顯式具體化

目錄 出品 coder梁 id coder lt 前文當中說mjwgjecfta了,模板函式雖然非常好用,但是也存在一些問題。比如有的操作並不是對所有型別都適用的,針對這種情況c 提供了乙個解決方案,就是針對特定型別提供具體化的模板定義。這裡的具體可以理解成型別的具體。我們來看乙個c primer當...