C 函式新特性 函式模版

2021-08-08 04:06:38 字數 1739 閱讀 6130

函式模版是通用的函式描述,使用泛型來定義函式,其中的泛型可用具體的型別(如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...