函式模版是通用的函式描述,使用泛型來定義函式,其中的泛型可用具體的型別(如int或double)來代替。通過將型別作為引數傳遞給模版,可使編譯器生成該型別的函式。
下面演示乙個最簡單的函式模版:
//交換兩資料的值
templatet>
void swap(t &a, t &b)
如果採用以下呼叫:
int a=10;
int b=20;
swap(a,b);
這將代表呼叫下面這個函式:
void swap(int &a, int &b)
swap()函式接受了兩個int引數,因此編譯器生成該函式的int版本,也就是說用int替換所有的t。
呼叫函式模版必須使用相同的型別,否則模版將無法識別不同的型別而導致編譯錯誤
顯式具體化也是基於函式模版的,只不過在函式模版的基礎上,新增乙個專門針對特定型別的、實現方式不同的具體化函式。
對於有些特殊型別,可能不適合模版實現,需要重新定義實現。此時可以使用顯式具體化(explicit specialization)
以上面的swap()模版為例,假定有如下結構體:
struct job;
如果採用swap()函式模版將交換兩個結構體。但如果只想交換其中的一部分,比如salary,而不交換name,則可以通過使用顯式具體化。
//結構體
struct job;
//函式模版
template
void swap(t &a, t &b)
//顯式具體化
templete<> void swap(job &a,job &b)
編譯器會優先選擇顯式具體化的版本,交換結構體的salary,而非交換兩個結構體。
對於交換結構體job的非模版函式、函式模版和具體化的原型:
//非模版函式
void swap(job &,job &);
//函式模版
template
void swap(t &,t &);
//顯式具體化
template
<>void swap(job &,job &);
在有多個原型時,編譯器在選擇原型時,非模版版本優先於顯式具體化和模版版本,而顯式具體化優先於使用模版生成的版本。
當顯式例項化模版時,在使用模版之前,編輯器根據顯式例項化指定的型別生成模版例項。
template
void swap(int&,int&);
顯式例項化只需要宣告,不需要重新定義。編譯器會根據模版來實現例項宣告和例項定義。
當然也可以直接呼叫swap(a,b);
//顯式具體化
template
<>void swap(job &,job &);
//或template
<>void swap(job &,job &);
//顯式例項化
template
void swap(int &,int &);
顯式具體化不僅要宣告,還要給出定義;
顯式例項化只需要宣告,不需要給出定義。
c 函式模版
如果需要多個將同乙個演算法用於不同型別的函式,請使用模版 函式模版 要讓編譯器知道程式需要乙個特定形式的交換函式,只需在程式中使用swap 函式即可,編譯器將檢查所使用的引數型別,並生成相應的函式,1.template void swap anytype a,anytype b anytype te...
C 之函式模版
函式模版是通用的函式描述,有時候也被稱為引數化型別。建立模版如下 template void swap any a,any b template void swap job job1,job job2 void show job j int main template void swap job j...
C 函式模版分離編譯
1.函式模版的編譯模式分兩種 完全包含編譯模式和區域性編譯模式 需要用export關鍵字 2.不同的編譯器對這兩種編譯模式的支援各不相同,但一般都支援完全包含編譯模式,具體支援情況需要參照具體使用的編譯器文件 模版函式和普通函式在使用的時候有一定的區別 1 普通函式在使用的原始檔中直接include...