函式模板是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
;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型。否則編譯器遇到模板的使用時才會隱式的生成相應的例項函式。
模板函式 例項化與具體化
首先,例項化從字面上來看就是產生乙個實際的事物。在函式模板中就是產生乙個特定的函式定義,例如有乙個swap函式 template void swap t a,t b 使用模板,並不意味著我們生成了一系列的函式定義,而是一種方案,當我們傳遞型別進入的時候才生成出對應的swap函式定義,比如現在swap...
C Primer Plus 例項化與具體化
template void swap t a,t b 函式模板 void main template void swap t a,t b template 函式模板 void swap t a,t b template void swap int int 使用swap模板顯示地生成int型別函式定義...
C 模板,模板具體化,特例化
函式同名 過載 時,呼叫優先順序通常為 普通函式 顯式具體化 template specilazation 顯式例項化 一般模版函式 但更一般而言,有兩條規則 1 如果各自函式形參和呼叫處的實參 並非精確匹配,則會優先選擇不需要轉換的 比如void func string str template ...