C 函式模板

2021-10-18 16:39:12 字數 1650 閱讀 8385

函式模板時通用的函式描述,他們使用泛型來定義函式,其中的泛型可以用具體的型別代替。將型別作為引數傳遞給模板,編譯器可以生成該型別的函式。

//examples

template

void

swap

(anytype& a, anytype& b)

//呼叫方式

intmain()

這裡的template和typename關鍵字是必須的,其中typename可以用class代替(前者的相容性更好),後面的anytype可以隨意替換為其他的合法名稱。

模板並不建立函式,只能告訴編譯器如何定義函式,當編譯器知道引數的型別int後會建立乙個引數型別為int的函式,將所有的anytype 替換為int。最終的程式並不會含有模板,而是實際的函式。使用模板可以使多個函式定義更加簡單,更加可靠。通常模板會放到標頭檔案中。

模板過載和一般的函式模板的操作相同,被過載的模板的函式特徵標必須不同。

//examples

template

void

swap

(anytype& a, anytype& b)

template

void

swap

(anytype& a, anytype& b,

int c)

模板可能無法處理所有的型別,如果模板中含有比較運算子,而引數是陣列型別。

函式中可能出現c++不允許的語法,如結構體相加。

顯示具體化就是具體化函式定義,包含完成某些功能的**。當編譯器找到與函式呼叫匹配的具體化定義是,將使用後該具體化定義,而不再尋找模板。

//examples

template<

>

void swap

(t a,t b)

;//宣告乙個顯示具體化的模板,當資料型別t為函式引數時,使用此函式

template<

>

void

swap

(t a,t b)

;//因為引數中已經宣告是t的顯示具體化,所以可以省略,兩種方式等價

隱式例項化、顯式例項化和顯示具體化統稱為具體化。都白哦是是使用具體型別的哈數定義,而不是通用描述。

編譯器對函式版本的選擇策略:

完全匹配時允許的無關緊要的轉換

從實參到形參

type

type&

type&

type

type

* type

type(argument-list)

type(*)(argument-list)

type

const type

type

volatile type

type *

const type

type *

volatile type

用來設定乙個值的型別,呼叫格式如下:

decltype

(expression)var;

//examples

int a=32;

decltype

(a)x;

//x的型別為int

具體核對方案:

c 函式模板

include using namespace std template t max t a,t b,t c int main int main int i1 185,i2 76,i3 567,i double d1 56.63,d2 90.23,d3 3214.78,d long g1 67854...

c 函式模板

關鍵字template總是放在模板的電腦關於與宣告的最前面,關鍵字後面是用逗號分隔的模板參數列,該列表是模板參數列,不能為空。模板引數可以是乙個模板型別引數,它代表了一種型別 也可以是乙個模板非型別引數,它代表了乙個常量表示式。模板型別引數由關鍵字class或typename後加乙個識別符號構成。在...

C 函式模板

c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...