那是C++自帶的模板庫,C的很少,而且代碼長難記且功能少,基本可以忽略。
從網站建設到定制行業解決方案,為提供成都網站設計、做網站服務體系,各種行業企業客戶提供網站建設解決方案,助力業務快速發展。創新互聯將不斷加快創新步伐,提供優質的建站服務。
要是用C的話,函數基本要自己寫的
各種用
C
語言實現的模板可能在使用形式上有所不同。現以一個求和函數
Sum
為例,用
C++
Template
可寫如下:
template
R
Sum(const
T
*array,
int
n)
{
R
sum
=
0;
for
(int
i
=
;
i
n
;
++i)
sum
+=
i;
return
sum;
}
如果不是內置類型,該模板隱式地需要
有R
R::operator+=(T)運算符可用。
1.
使用函數指針作為
Functor
替換者
Typedef
struct
tagAddClass
{
Void
(*add)(char*
r1,
const
char*
r2);
Int
elemSize;
Char
sum[MAX_ELEM_SIZE];
}
AddClass;
void
Sum(AddClass*
self,
const
char*
array,
int
n)
{
for
(int
i
=
;
i
n
;
++i)
self-add(self-sum,
array
+
i*self-elemSize);
}
使用時:
Void
AddInt(char*
r1,
const
char*
r2)
{
*(long*)r1
+=
*(int*)r2;
}
AddClass
addClass
=
{AddInt,
2,
};
Int
array[100];
Read(array);
Sum(addClass,
array,
100);
…..
2.
用宏作為Functor的替換者
#define
GenSumFun(SumFunName,
Add,
RetType,
ElemType)
RetType
SumFunName
(const
ElemType
*array,
int
n)
\
{
RetType
sum
=
0;
for
(int
i
=
;
i
n
;
++i)
Add(sum,
i);
return
sum;
}
使用時:
#define
AddInt(x,
y)
((x)
+=
(y))
GenSumFun(SumInt,
AddInt,
long,
int)
…..
Int
array[100];
Read(array);
Long
sum
=
SumInt(array,
100);
…..
3.
所有可替換參數均為宏
至少需要一個額外的文件(實現文件)為
impsum.c
/*
impsum.c
*/
RetType
FunName(const
ElemType
*array,
int
n)
{
RetType
sum
=
0;
for
(int
i
=
;
i
n
;
++i)
Add(sum,
i);
return
sum;
}
使用時:
#undef
RetType
#undef
FunName
#undef
ElemType
#undef
Add
#define
AddInt(x,
y)
((x)
+=
(y))
#define
RetType
long
#define
FunName
SumInt
#define
ElemType
int
#define
Add
AddInt
#include
impsum.c
…..
Int
array[100];
Read(array);
Long
sum
=
SumInt(array,
100);
4.
總結:
第一種方法,易于跟蹤調試,但是效率低下,適用于對可變函數(函數指針)的效率要求不高,但程序出錯的可能性較大(復雜),模板函數(Sum)本身很復雜,模板參數也比較復雜(add)的場合。
第二種方法,效率高,但很難跟蹤調試,在模板函數和模板參數本身都很復雜的時候更是如此。
第三種方法,是我最近幾天才想出的,我認為是最好的,在模板參數(Add)比較復雜時可以用函數(第二種也可以如此),簡單時可以用宏,并且,易于調試。在模板函數本身很復雜,而模板參數比較簡單時更為優越。但是,可能有點繁瑣。
首先,C沒有函數模版。C++才有。
其次,template class T是函數聲明的一部分,所以下面函數實現應該是:
template class T
void swap(T a,T b){
int temp;
temp=a;
a=b;
b=temp;
}
最后,#include iostream,在標準的C++函數中,std的域中已經有一個swap函數。
而且前面也using namespace了。函數聲明重復。
兩個辦法:
1 swap(i,j);改為 ::swap(i,j); //全局化。
2 swap改個名字。
這些都是C++的玩意
T min( T (arr)[size] ); //T (arr)[size] arr是個數組的引用, 如果去掉括號,就變成引用的數組,而引用的數組是不存在的,改成T*就成了第二種定義了
用引用當參數,比如min(a),a就是實參本身,而不是副本,這是C語言所沒有的特性. 既然是實參本身,那么數組a就不會退化為指針,也就是說,編譯器可以可以獲得a的大小,所以size就不需要提供了
而第一種和第二種,arr退化為指針了,所以必須通過其他途徑提供數組長度,
分享題目:c語言函數模版 c++ 模版函數
本文鏈接:http://m.kartarina.com/article36/dodespg.html
成都網站建設公司_創新互聯,為您提供網站改版、品牌網站制作、搜索引擎優化、網站排名、響應式網站、微信小程序
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯