C 函式模板

2021-08-22 19:30:01 字數 1905 閱讀 8601

函式模板是通用的函式描述,它們使用泛型來定義函式,其中的泛型可用具體的型別替換。通過將型別作為引數傳遞給模板,可使編譯器生成該型別的函式。由於模板允許以泛型(而不是具體型別)的方式編寫程式,因此有時候也被稱為通用程式設計。

在標準c++98新增關鍵字typename之前,c++使用關鍵字class來建立模板。例如:

在c++11中,可以將class替換為typename。

呼叫該函式模板:

過載的函式模板

例如:

模板的顯示具體化

假設有乙個結構體,c++允許將乙個結構體賦給另乙個結構體,如果只想交換其中部分成員,則需要不同的**。

可以提供乙個具體化函式定義——顯示具體化。當編譯器找到與函式呼叫匹配的具體化時,將使用該定義,而不再尋找模板。

1. 對於給定的函式名,可以有非模板函式,模板函式,和顯示具體化函式以及它們的過載版本。

2.顯示具體化的原型和定義應以template<>打頭,並通過名稱來指出型別。

3.具體化優先於常規模板,非模板函式優先於具體化和模板函式。

例如:

例項化:

函式呼叫swap(i,j)導致編譯器生成swap()的乙個例項,該例項使用int型別。

模板並非函式定義,但使用int的模板例項就是函式定義,這種例項化方式被稱為隱式例項化。

c++允許顯示例項化,template void swap(int&, int & )

編譯器選擇使用哪個函式版本

對於函式過載,函式模板,函式模板過載,c++有定義乙個良好的策略,來決定為函式呼叫使用哪乙個函式定義,尤其是有多個引數時,這個過程稱為過載解析。

1.完全匹配,但常規函式優先於模板。

2.提公升轉換(char 與short自動轉換為int,float自動轉換為double)。

3.標準轉換(int轉換為char,long轉換為double)。

4.使用者定義的轉換,如類宣告中定義的轉換。

函式的變數型別與返回型別

函式有多個引數型別時

x + y 的型別無法**出來,使用decltype關鍵字來猜測型別。

如果函式有返回值型別:無法預先知道x + y的型別,此時還未宣告引數x 和 y,他們不在作用域內(編譯器無法看到它們,無法使用它們)。必須在宣告引數後使用decltype。

現在,decltype在引數後邊宣告,因此x, y位於作用域內,可以使用它們。

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