c 基礎之模板函式

2021-07-28 11:37:07 字數 3478 閱讀 9354

如果現在需要定義乙個通用的加法函式。

我們首先會想到函式過載:即針對每個所需相同行為的不同型別,重新實現它

#include

using

namespace

std;

int funtest1(const

int& left,const

int& right)

float funtest2(const

float& left,const

float& right)

int main()

這樣的函式會有很多的缺點,比如:

*只要有新型別出現就會新增對應的**

*除型別外,所有函式的函式體都相同,**復用率不高

*如果函式只是返回值型別不同,函式過載不能解決。

*乙個方法有問題,所有的方法都有問題,不好維護。

我們可能還會想到宣告

#define add (left,right)?((a)+(b))
*但是宣告的缺點就是不是函式,不進行型別檢測,安全性不高。

##所以接下來我們就可以考慮使用函式模板

<1>定義:函式模板代表了乙個函式家族,該函式與型別無關在使用時被引數化,根據實參型別產生函式的特定型別版本。

<2>格式

template

返回值型別 函式名 (引數列表)

例如如下模板函式用來實現加法類函式

#include

using

namespace

std;

template

t add(t left,t right)

int main()

在上述**中如果我們想要對兩個不同型別的數字進行加法運算,編譯器就會報錯,例如以下情況:

cout<
為了想要其編譯通過

則需要進行顯示例項化這樣才會編譯通過。

cout

(10,10.0)編譯器只會執行兩種轉換:#include

using

namespace

std;

template

t add(const t& i)

int main()

#include

using

namespace

std;

template

t add(t i)

void funtest(int ,int)

{}int main()

列印的結果為:

int *

void (__cdecl*)(int,int)

請按任意鍵繼續. .

template

//u前沒有帶關鍵字,編譯會出錯

t add(t i,u u)

#include

using

namespace

std;

typedef

char t;

template

t test1(t i)

t t;

int main()

列印出的結果為:

i.type=int

t.type=int

請按任意鍵繼續…

故有此證明上文所述。

1.非模板型別形參是模板內部定義的常量,在需要常量表示式的時候可以使用非模板型別引數

例如:求陣列長度

template

void test(t (&a)[n])

int main()

其中n則代表了陣列長度。

2.和函式引數表一樣,跟多個引數必須用逗號隔開,例項化時候2個引數可以相同也可以不同

例如:

template

void test(t1 i,t2 j)

{}int main()

由程式我們可以看到,test在傳參的時候傳了乙個int型乙個char型,但是編譯器並沒有報錯。

例如:我們需要寫乙個比大小的函式你可能會這麼寫:

template 

const t& max(const t& left,const t& right)

int main()

但是如果我需要比較三個數的大小,則編譯器就會報錯,解決這個問題的方法就是寫乙個函式與max函式構成過載

const t& max(const t& left,const t& mid,const t& right)

template 

const t& max(const t& left,const t& right)

template

const t& max(const t& left,const t& mid,const t& right)

const

int & max(int

left,int

right)

int main()

如果我們除錯的時候跟進去會發現max呼叫的是非模板函式,如圖:

程式執行的結果是:6

則可以驗證上文說法。

以上函式過載雖然可以解決比較多個引數大小的問題,但是其解決不了比較兩個字串的問題,而只是將兩個字串的首元素的位址進行比較

這個時候我們可以進行函式的特化

template

const t& max(const t& left,const t& right)

template

<>//函式特化

char* const & max(char* const& left,char* const& right)

int main()

輸出是:hell

C 基礎 模板基礎與函式模板

求兩個int float char型別的資料的最大值 c裡面要這樣寫 int maxint int x,int y double maxdouble double x,double y char maxchar char x,char y c 使用函式過載 多個同名函式處理多種型別資料的語法現象 可...

C 模板之函式模板

c 中分為函式模板和類模板,它們之間的相同點是都含有模板型參表,不同點在模板例項化的時候函式模板可以不用顯示的宣告模板類項,編譯器會自動幫我們匹配,而類模板則需要顯示定義出來,例如 template compare type type compare a,b template class queue...

C 模板之函式模板

泛型程式設計 編寫與型別無關的邏輯 是 復用的一種手段。模板是泛型程式設計的基礎 模板代表乙個函式家族,該函式與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本 它本身不是類或函式 模板函式的格式 模板的例項化 產生模板特定型別的過程稱為函式模板的例項化 template t add ...