C 模版 顯式例項化 顯式具體化 隱式例項化

2021-09-02 15:07:30 字數 2420 閱讀 7440

**:helloword的部落格

函式模板是c++新增的一種性質,它允許只定義一次函式的實現,即可使用不同型別的引數來呼叫該函式。這樣做可以減小**的書寫的複雜度,同時也便於修改(注:使用模板函式並不會減少最終可執行程式的大小,因為在呼叫模板函式時,編譯器都根據呼叫時的引數型別進行了相應例項化)。下面來看看函式模板的使用過程:

struct job

;template //函式模板宣告,通用變數型別為t

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

void showjob(const job &a);//列印job內容

using std::cin;

using std::cout;

using std::endl;

void main(void)

void showjob(const job &a)

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

2>定義同名常規函式

void swap(job &a, job &b)

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

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

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

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

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

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

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

函式模板:

#define maxname 128

struct job

;templatevoid swap(t &a, t &b )

;template void swap(int &a, int & b); //顯式例項化,只需宣告

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

;//explicite specialization.

類模板:

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);

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

C 模版 顯式例項化 顯式具體化 隱式例項化

helloword的部落格 函式模板是c 新增的一種性質,它允許只定義一次函式的實現,即可使用不同型別的引數來呼叫該函式。這樣做可以減小 的書寫的複雜度,同時也便於修改 注 使用模板函式並不會減少最終可執行程式的大小,因為在呼叫模板函式時,編譯器都根據呼叫時的引數型別進行了相應例項化 下面來看看函式...

C 隱式例項化 顯式例項化 顯式具體化的關係

程式演示 include struct job swap 模板原型 template typename t void swap t a,t b 模板的顯式例項化,使用double結合模板去建立乙個函式定義 template void swap double double double 顯式具體化的原...

C 模板顯式具體化

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