c為什麼存在顯式例項化,顯式具體化兩種顯式宣告

2021-03-05 09:13:39 字數 3340 閱讀 4476

1樓:匿名使用者

1>顯式具體化

顯式具體化也是基於函式模板的,只不過在函式模板的基礎上,新增乙個專門針對特定型別的、實現方式不同的具體化函式。

[cpp] view plain copy

template<>void swap(job &a, job &b)

如上所示,該具體化函式的實現與模板並不一致,編譯器解析函式呼叫時會選擇最匹配的函式定義。

2>定義同名常規函式

[cpp] view plain copy

void swap(job &a, job &b)

由於編譯器在過載解析時,會選擇最匹配函式定義,所以在呼叫swap(joba, jobb)時,編譯器會選擇void swap(job &a, job &b)函式定義,而遮蔽了模板函式。

同時,模板函式也可以過載,其操作與常規函式一致。

[cpp] view plain copy

上面主要說的是函式模板的具體化,下面說下模板例項化。

函式模板:

[cpp] view plain copy

#define maxname 128

struct job

;  template

void swap(t &a, t &b )

顯式例項化,只需宣告

template<>顯式具體化(上面已經講過,注意與例項化區分開,必須有定義)

;//explicite specialization.

類模板:

[cpp] view plain copy

template

class arrary

;//template class declaration.

template class array;   //explicit instantiation. 顯式例項化

template<> class array

;//expicit specialization.   顯式具體化,類定義體可以不同於類模板array

相應的,隱式例項化指的是:在使用模板之前,編譯器不生成模板的宣告和定義例項。只有當使用模板時,編譯器才根據模板定義生成相應型別的例項。如:

int i=0, j=1;

swap(i, j);  //編譯器根據引數i,j的型別隱式地生成swap(int &a, int &b)的函式定義。

arrayarval;//編譯器根據型別引數隱式地生成array類宣告和類函式定義。

顯式例項化:

當顯式例項化模板時,在使用模板之前,編譯器根據顯式例項化指定的型別生成模板例項。如前面顯示例項化(explicit instantiation)模板函式和模板類。其格式為:

template typename function(argulist);

template class classname;

顯式例項化只需宣告,不需要重新定義。編譯器根據模板實現例項宣告和例項定義。

顯示具體化:

對於某些特殊型別,可能不適合模板實現,需要重新定義實現,此時可以使用顯示具體化(explicite specialization)。顯示例項化需重新定義。格式為:

template<> typename function(argu_list);

template<> class classname;

綜上:template<> void swap(job &a, job &b) ;是函式模板的顯式具體化,意思是job型別不適用於函式模板swap的定義,因此通過這個顯式具體化重新定義;也可簡寫作template<> void swap(job &a, job &b);

是函式模板的乙個顯式例項化,只需宣告,編譯器遇到這種顯式例項化,會根據原模板的定義及該宣告直接生成乙個例項函式,該函式僅接受job型。否則編譯器遇到模板的使用時才會隱式的生成相應的例項函式。

2樓:匿名使用者

around mexico's day

c++函式模板的顯示例項化和顯式具體化是什麼。?解釋下 這個例子

3樓:匿名使用者

template

void fun(a a){}

template<>

void fun(int a)//顯式具體化void main()

c++函式模板的顯示例項化有什麼好處?我知道 顯示具體化就是使它特殊化,顯示例項化就是手動例項化?

4樓:匿名使用者

明確例項化點。例如

template

void f(t& t)

class a{};

void g(const a& a); // 函式1template <>  void f(a& t); // 顯式例項化

void g(a& a)

在c++中模板的顯式具體化感覺可以用常規函式替代的,模板的顯式具體化有什麼特別與常規函式的嗎

5樓:淪落人

我覺得完全可以代替。

但是這樣做顯得很系統吧,就比如你有乙個模板,只有int處理方式不同,那麼把int具體化,顯得很系統很規整。當然直接寫乙個普通的int函式來遮蔽模板也是可以的,只是看上去就沒那麼整齊,可讀性降低了。

6樓:如果

模板template的作用就是過載和**復用,就是為了簡化你書寫的**。顯示具體化就是使用模板的一種方法,把型別,引數選定了;當然還有顯示例項化和隱式例項化...

c++顯式具體化的函式和非模板函式有什麼區別

7樓:

事常與人違,事總在人為。

8樓:宿命的輪迴

不一樣, 具體化的函式的引數的型別是確定的。。 job是乙個確定的型別!

但是templte的函式的引數型別可以任意自定義。

c++函式模版顯示例項化宣告: 5

9樓:校園古惑仔

將你的t替換成具體型別即可:

顯式初始化什么意思,顯式初始化 什麼意思

初始化就是把變數賦為預設值,把控制項設為預設狀態,把沒準備的準備好。但是如果是整個系統初始化那就不一樣了。在組合語言中,為變數分配空間時,初始化過的變數的初值位於可執行檔案 段資料後,會佔用一定空間,不必要的初始化會造成磁碟空間的浪費。在c語言等高階語言中,為每乙個變數賦初值被視為良好的程式設計習慣...

c程式為什麼顯視有錯

include int main int a,b,c,i int max int x,int y int mll int x,int y int add int x,int y scanf d,d,d a,b,i 輸入的時候要取位址符號 刪去輸入換行 if i 1 c max a,b else if...

維生素C的化學結構式是什麼樣的,維生素C化學式

維生素c的分子結構主要是由乙個五元內酯環及其側鏈組成。由於維生素c是由開鏈型蘇糖型 2,3,4,5,6 五羥基 2 己烯酸1位上的羧基與4位上的羥基脫去一分子水縮合成環,因此,維生素c的化學名稱為 蘇糖型 2,3,4,5,6 五羥基 2 己烯酸 4 內酯。在維生素c分子結構中的2,3,4,5,6位各...