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 ...