深入理解函式模板

2022-06-21 06:18:14 字數 1638 閱讀 9511

函式模板深入理解

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

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

對模板**本身進行編譯

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

注意事項:

-函式模板本身不允許隱式型別轉換

自動推導型別時,必須嚴格匹配

顯示型別指定時,能夠進行隱式型別轉換

程式設計實驗

函式模板本質分析

#include #include 

using

namespace

std;

class

test

};template

void swap(t& a, t&b)

typedef

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

typedef

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

typedef

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

intmain()

多引數函式模板

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

template

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 = 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 #include 

using

namespace

std;

template

t1 add(t2 a, t3 b)

intmain()

過載函式模板

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

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

-c++編譯器優先考慮普通函式

-如果函式模板可以產生乙個更好的匹配,那麼選擇模板

-可以通過空模板實參列表限定編譯器只匹配模板

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)

intmain()

57 深入理解函式模板

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

57 深入理解函式模板

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

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

上一節我們對函式模板有了具體的了解,這節我們在深入的了解一下函式模板 1 編譯器從函式模板通過具體型別產生不同的函式 2 編譯器會對函式模板進行兩次編譯 示例 函式模板的本質 include using namespace std class test templatevoid swap t a,t...