C 函式模板 模板例項化 具體化

2021-07-04 10:48:59 字數 2525 閱讀 3438

函式模板是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)

; job jobb = ; 

cout<<"before swap";

showjob(joba);

showjob(jobb);

cout<

swap(joba, jobb);

cout<<"after swap";

showjob(joba);

showjob(jobb);

coutvoid swap(t &a, t &b)

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

;template

void 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 函式模板 模板例項化 具體化

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

C 函式模板 模板例項化 具體化

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

模板函式,模板函式過載,顯示具體化模板,例項化

編譯器在選擇原型時,非模板版本函式優先於顯示具體化和模板版本函式,而顯示具體化優先於使用常規模板函式版本。1 函式模板 宣告與定義時均需加上template 說明為函式模板。eg template declaration eg.template void swap t a1 t a2 函式模板宣告。...