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位各...