C 57 深入理解函式模板

2021-09-12 22:30:55 字數 2919 閱讀 1026

#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(funct)(test&, test &);

int main()

輸出:

pi = 0x80487e4

pd = 0x8048806

pt = 0x8048828

編譯器做了什麼?

funci* pi = swap; ==>

編譯器自動型別推導 ==> 生成對應的 swap 函式 ==> 語法檢查合法後將 swap 位址賦值給 pi

關於編譯器對函式模板進行的兩次編譯
第 1 次:對模板**本身進行的編譯檢查

#include using namespace std;

template < typename t >

void swap(t& a, t& b)

int main()

輸出:【g++】

test.cpp: in function 『void swap(t&, t&)』:

test.cpp:9: error: expected 『,』 or 『;』 before 『a』

第 2 次:對引數替換後的**進行編譯檢查

#include using namespace std;

class test

};template < typename t >

void swap(t& a, t& b)

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

int main()

輸出:【g++】

test.cpp: in function 『void swap(t&, t&) [with t = test]』:

test.cpp:27: instantiated from here

test.cpp:8: error: 『test::test(const test&)』 is private

test.cpp:18: error: within this context

分析:funct* pt = swap; ==>

編譯器自動型別推導, t 為test型別 ==> 生成對應的 swap 函式 ==> 語法檢查拷貝建構函式為私有,給出錯誤提示

template < typename t1, typename t2, typename t3 >

t1 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 = double, t2 = double, t3 = float

double r2 = add(0.5, 0.8);

// t1 = float, t2 = float, t3 = float

float r3 = add(0.5, 0.8);

工程中將返回值引數作為第乙個型別引數

#include using namespace std;

template < typename t1, typename t2, typename t3 >

t1 add(t2 a, t3 b)

int main()

輸出:

r1 = 1

r2 = 1.3

r3 = 1.3

有趣的問題:

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

int r1 = max(1, 2);

double r2 = max<>(0.5, 0.8);

#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()

輸出:

int max(int a, int b)

2t max(t a, t b)

2t max(t a, t b)

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

t max(t a, t b)

t max(t a, t b)

7int max(int a, int b)

100max('a', 100) 普通函式被呼叫

函式模板本身不允許隱式型別轉換,普通函式被匹配後進行隱式型別轉換

57 深入理解函式模板

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

57 深入理解函式模板

1 函式模板深入理解 編譯器從函式模板通過具體型別產生不同的函式 編譯器會對函式模板進行兩次編譯 1 對模板 本身進行編譯 2 對引數替換後的 進行編譯 程式1 證明編譯器會對函式模板進行兩次編譯 include include using namespace std class test temp...

第57課 深入理解函式模板

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