C 泛型程式設計(上) 函式模板

2021-10-09 05:44:21 字數 3254 閱讀 8737

c++提供了函式模板,通過函式模板建⽴⼀個通⽤函式,其函式型別和形參型別不具體制定,⽤⼀個虛擬的型別來代表,這個通⽤函式就成為函式模板。

寫兩個demo展示一下非模板函式與模板函式的區別

int

my_min

(int a,

int b)

double

my_min

(double a,

double b)

void

test()

缺點一幕了然 引數是固定的,如果想加入別的引數只能進行過載 非常麻煩,復用性幾乎為零

template

<

class

t>

t my_min

(t a, t b)

void

test()

定義模板引數時,使⽤class 和 typename 等價,但 typename  在模板中也有其他的⽤途。
template

<

class

t>

t min

(t a, t b)

template

<

typename t>

t min

(t a, t b)

1.  模板引數可以多個。

2. 模板既可以是型別、也可以是編譯期常量。

3. 模板引數可以有預設值。

template

<

classt1,

class

t2>

t1 my_min

(t1 a, t2 b)

template

<

classt=

int>

t my_max

(t a, t b)

template

<

classt,

int n>

t my_equal

(t a, t b)

void

test()

函式模板的型別是調⽤時根據引數的型別⾃動推導出來的,型別推導僅限於函式模板,對於類模板是

不能夠進⾏⾃動型別推導的。

template

<

class

t>

t my_min

(t a, t b)

void

test()

函式模板也和普通函式⼀樣⽀持重載,過載的條件和普通函式⼀樣:

1. 同⼀個作⽤域

2. 引數個數不同

3. 引數型別不同

4. 引數順序不同

template

<

class

t>

t my_min

(t a, t b)

template

<

class

t>

t my_min

(t a, t b, t c)

1.  c++編譯器優先匹配普通函式。

2. 通過模板空實引數指定編譯器只能匹配函式模板。

3. 如果函式模板可以產⽣⼀個更好的匹配,那麼選擇模板。

template

<

class

t>

t my_min

(t a, t b)

intmy_min

(int a,

int b)

void

test()

1.  普通函式⽀持隱式型別轉換。

2. ⾃動型別推導,不⽀持隱式型別轉換。

3. 顯式指定模板引數型別,⽀持隱式型別轉換。

template

<

class

t>

t my_min

(t a, t b)

intmy_min

(int a,

char b)

void

test()

c++並不是把函式模板當成能夠處理任何型別的函式,函式模板根據具體的調⽤情況,產⽣出對應的具體的函式版本,供程式調⽤。

函式模板編譯機制:

我們將第⼀個例⼦中的程式進⾏編譯,編譯後根據實際調⽤情況⽣成以下三個函式,分別對應

int 、 double 、 char 型別的版本

_z6my_miniiet_s0_s0_

_z6my_minidet_s0_s0_

_z6my_minicet_s0_s0_

函式模板和普通函式共存:

1. 如果普通函式能夠匹配調⽤,編譯器不會再⽣成模板函式。

2. 當調⽤函式時通過空引數列表強制匹配函式模板,此時編譯器會再根據函式模板產⽣⼀個模板函

數。

template

<

class

t>

t my_min

(t a, t b)

intmy_min

(int a,

int b)

void

test()

**編譯過後會生成4個函式

_z6my_minii

_z6my_miniiet_s0_s0_

_z6my_minidet_s0_s0_

_z6my_minicet_s0_s0_

1.獨⽴編譯即 c++編譯器編譯  a.cpp時,並不知道  b.cpp中定義了哪些符號,當鏈結時,如果發現

2. 編譯器會對函式模板進⾏兩次編譯,在宣告的地⽅對模板**本身進⾏編譯,在調⽤的地⽅對參

數替換後的**進⾏編譯。

這會導致模板分⽂件編寫時的⼀些問題:

具體demo不再書寫,只要記住,大部分情況下模板宣告和實現在乙個檔案內即可。字尾為**.hpp**

函式模板(泛型程式設計)

函式模板就是將函式型別引數化,方便程式設計。1 普通函式模板 include using namespace std template template是告訴編譯器,要開始泛型程式設計了,並用t替代函式的引數型別 void myswap t a,t b template 定義兩個泛型,其實定義乙個也...

泛型程式設計 函式模板

當函式的業務邏輯相同但是函式的引數不相同時,讓型別引數化,讓程式設計師能夠方便程式設計,就用到了泛型程式設計。基本語法 includeusing namespace std 函式的業務邏輯一樣但是函式的引數不一樣 void myswap01 int a,int b void myswap02 cha...

C 泛型程式設計 函式模板 類模板

以前我們寫過乙個簡單的交換函式。我們不難發現交換函式是與型別有很大關係的,int,double.那麼如何實現乙個通用的交換函式呢?void swap int left,int right void swap double left,double right void swap char left,c...