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