57 深入理解函式模板

2021-09-27 03:40:54 字數 1658 閱讀 3086

1、函式模板深入理解

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

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

1、對模板**本身進行編譯

2、對引數替換後的**進行編譯

程式1:證明編譯器會對函式模板進行兩次編譯

#include #include using namespace std;

class test

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

typedef void (funci)(int&, int&); //重新命名了函式型別,必須通過指標指向某個函式才能有效編譯器自動推導 t 為 int

typedef void (funcd)(double&, double&); //編譯器自動推導 t 為 double

//typedef void (funct)(test&, test&); //拷貝建構函式為private,17行**不能進行拷貝構造

int main()

分析:首先對模板**本身進行編譯這是肯定的,如果對引數替換後的**不進行編譯,那麼我們所輸出的指標位址都是同乙個值,因此編譯器會對函式模板進行兩次編譯,且編譯器會自動推導 t 的型別。

2、多引數函式模板

templatet1 add(t2 a,t3 b)

int r = add(0.5, 0.8);
//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);

工程中將返回值引數作為第乙個型別引數!其餘的引數 編譯器可以自己去推導,一般遇見小數,編譯器預設為 double 型別

#include #include using namespace std;

templatet1 add(t2 a, t3 b)

int main()

分析:這個程式主要是告訴我們多引數模板的使用,以及前面提到的一點,顯示型別指定時,能夠進行隱式型別轉換。返回值引數作為第乙個型別引數,必須顯示指定,其餘的引數無所謂。

3、過載函式模板

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

小結

57 深入理解函式模板

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

C 57 深入理解函式模板

include using namespace std class test template typename t void swap t a,t b typedef void funci int int typedef void funcd double double typedef void ...

第57課 深入理解函式模板

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