五十七課 深入理解函式模板

2021-08-24 23:16:51 字數 1690 閱讀 1986

上一節我們對函式模板有了具體的了解,這節我們在深入的了解一下函式模板

1、編譯器從函式模板通過具體型別產生不同的函式

2、 編譯器會對函式模板進行兩次編譯

示例:函式模板的本質

#include using namespace std;

class test

};templatevoid swap(t& a,t& b)

typedef void (funci)(int&,int&);

typedef void (funcd)(double&,double&);

typedef void (funct)(test&,test&);

int main()

列印結果

通過列印指標的位址我們就可以看到這是兩個不同的函式。

1、函式模板可以定義任意多個不同的型別引數

template

t1 add(t2 a,t3 b)

2、對於多引數模板(1)無法自動推導返回值型別

(2)可以從左到右部分指定型別引數

//t1=int t2=double t3=double

int r1 = add(0.5,0.8);

//t1=int t2=float t3=double

int r2 = add(0.5,0.8);

//t1=int t2=float t3=float

int r3 = add(0.5,0.8);

在工程中如果返回值為泛指型別,我們就將返回值引數作為第乙個型別引數,推薦第一種寫法。示例:多引數函式模板

#include using namespace std;

template

t1 add(t2 a,t3 b)

int main()

列印結果

這個示例告訴我們工程中一定要將返回值引數作為第乙個型別引數

當函式過載遇見函式模板會發生什麼?

函式模板可以像普通函式一樣被過載

int r1 = max(1,2);

double r2 = max<>(0.5,0.8); //限定編譯器只選擇模板

示例:過載函式模板

#include #include using namespace std;

template < typename t >

t max(t a, t b)

int max(int a, int b)

template < typename t >

t max(t a, t b, t c)

int main()

注意:函式模板本身不允許隱示型別轉換函式模板通過具體型別產生不同的函式

函式模板可以定義任意多個不同的型別引數

函式模板的返回值型別必須顯示指定

函式模板可以向普通函式一樣被過載

第57課 深入理解函式模板

本文內容來自於對狄泰學院 唐佐林老師 c 深度解析 課程的學習總結 函式模板 編譯器從函式模板通過具體型別 產生不同的函式 編譯器會 對函式模板進行兩次編譯 注意事項 函式模板本身不允許隱式型別轉換 實驗 include include using namespace std class test ...

深入理解函式模板

函式模板深入理解 編譯器從函式模板通過具體型別產生不同的函式 編譯器會對函式模板進行兩次編譯 對模板 本身進行編譯 對引數替換後的 進行編譯 注意事項 函式模板本身不允許隱式型別轉換 自動推導型別時,必須嚴格匹配 顯示型別指定時,能夠進行隱式型別轉換 程式設計實驗 函式模板本質分析 include ...

57 深入理解函式模板

深入理解 編譯器從函式模板通過具體型別產生不同的函式。編譯器會對函式模板進行兩次編譯 對模板 本身進行編譯,對引數替換後的 進行編譯。注意事項 函式模板本身不是函式,是產生函式模子,因此模板本身不允許隱式型別轉換,自動推導型別時,必須嚴格匹配。顯示型別指定時,能夠進行隱式型別轉換。include i...