如果現在需要定義乙個通用的加法函式。
我們首先會想到函式過載:即針對每個所需相同行為的不同型別,重新實現它
#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()
列印出的結果為:1.非模板型別形參是模板內部定義的常量,在需要常量表示式的時候可以使用非模板型別引數i.type=int
t.type=int
請按任意鍵繼續…
故有此證明上文所述。
例如:求陣列長度
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 ...