函式模板是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 函式模板宣告。...