c 模板的具體化與例項化

2021-09-06 07:34:48 字數 2287 閱讀 3359

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