函式與類 模板的例項化與特化

2021-07-02 07:58:30 字數 1667 閱讀 9121

首先,我們給出模板函式和模板類的定義:

template void swap(t& a, t& b) 

template class myclass ;

double dnum = 12.2;

double dnum2 = 4.4;

swap(dnum, dnum2);

myclassmyobj;

需要注意的一點,隱式例項化時,編譯器在需要物件之前,不會生成類的定義。

myclass*myobjptr; //只是類的指標,還沒有生成物件

myobjptr = new myclass; //現在才生成了乙個類物件

在第二條語句,即new之後,編譯器才根據通用模板來生成類的定義,並根據該定義建立了乙個物件。

顯式例項化 ,使用的關鍵字叫做 template 。

template void swap(int, int);

template class myclass;

在這種情況下,雖然沒有建立或提及類物件,但是編譯器也將會生成類定義。和隱式例項化一樣,顯式例項化也將根據通用模板來生成定義。

顯式特化,有些地方也翻譯為 顯式具體化,指的是同乙個內容。使用的關鍵字為 template<> 。

因為有時候,對於特殊型別例項化時,我們需要的行為與通用模板的定義不太一致。此時,就要用到顯式特化(explicit specialization)。

template<> void swap(int&, int &);

//or

template<> void swap(int&, int &);

template<>

class myclass

注意,在同乙個檔案或轉換單元中,使用同一種型別的顯式例項化和顯式特化將會編譯出錯。即不能對相同的型別,同時使用explicit instantiation和explicit specialization。

最後,還要講一點,這一點也很重要。

部分特化可以給型別引數之一指定具體的型別:

//general template

template class pair ;

//partial specialization with t2 set to int

template class pair;

關鍵字template後面的<>宣告的是沒有被特化的型別引數。因此,上述第二個宣告將t2特化為int,但t1保持不變。注意,如果指定所有的型別,那麼<>將為空,這就變成了顯式特化(explicit specialization)。

C 模板的例項化與模板的特化,顯示特化示例。

模板例項化 從通用版本中實現乙個特化版本的實現,如將函式模板顯式特化。模板特化 指定編譯器呼叫哪一種型別的實現 先看 乙個最簡單的模板形式,如下。template typename t t max t a,t b 我們知道這乙個模板可以將任意兩個型別相同並且可以使用 進行比較的變數進行比較,並且可以...

模板與模板特化

當某一類函式函式功能相同,而只是函式引數型別不同時,可以採用函式模板,以簡化 同樣的,當類只是成員函式的型別及函式引數型別和資料成員的型別不同時,我們也可以使用類模板對其進行泛化。template t add const t t1,const t t2 當模板的泛化處理不適合摸個特定的資料型別時,可...

類模板的特化和函式模板的過載與類模板的繼承

類似於函式模板的特化,類模板的特化也是在類模板定義以後,用template來說明乙個模板的特化型別,特化的類模板甚至可以定義新的資料成員和成員函式,下面就是乙個類模板特化的例子 include template class a t compute template class a int compu...