① C中的模板怎樣使用 最好給個例子~
看看這個吧
http://www.njcc.e.cn/njhysite/njhygao_js/xuebao/xuebao0402/zhjm.doc
其他的見
C語言中實現模板函數的方法
在C語言中實現模板函數的方法:
各種用C語言實現的模板可能在使用形式上有所不同。
現以一個求和函數Sum為例,用C++Template可寫如下:
template<classT,classR> RSum(constT*array,intn)
{
Rsum=0;
for(inti=0;i<n;++i)
sum+=i;
returnsum;
}
如果不是內置類型,該模板隱式地需要有RR::operator+=(T)運算符可用。
1. 使用函數指針作為Functor替換者
TypedefstructtagAddClass
{
Void(*add)(char*r1,constchar*r2);
IntelemSize;
Char sum[MAX_ELEM_SIZE];
}AddClass;
voidSum(AddClass*self,constchar*array,intn)
{
for(inti=0;i<n;++i)
self->add(self->sum,array+i*self->elemSize);
}
使用時:
…..
VoidAddInt(char*r1,constchar*r2)
{
*(long*)r1+=*(int*)r2;
}
AddClassaddClass={AddInt,2,0};
Intarray[100];
Read(array);
Sum(&addClass,array,100);
…..
2. 用宏作為Functor的替換者
#define GenSumFun(SumFunName,Add,RetType,ElemType) \
RetTypeSumFunName(constElemType*array,intn) \
{ \
RetTypesum=0; \
for(inti=0;i<n;++i) \
Add(sum,i); \
returnsum; \
}
使用時:
#defineAddInt(x,y) ((x)+=(y))
GenSumFun(SumInt,AddInt,long,int)
…..
Intarray[100];
Read(array);
Longsum=SumInt(array,100);
…..
3. 所有可替換參數均為宏
至少需要一個額外的文件(實現文件)為impsum.c
/*impsum.c*/
RetTypeFunName(constElemType*array,intn)
{
RetTypesum=0;
for(inti=0;i<n;++i)
Add(sum,i);
returnsum;
}
使用時:
#undef RetType
#undef FunName
#undef ElemType
#undef Add
#defineAddInt(x,y) ((x)+=(y))
#defineRetTypelong
#defineFunNameSumInt
#defineElemTypeint
#defineAdd AddInt
#includeimpsum.c
…..
Intarray[100];
Read(array);
Longsum=SumInt(array,100);
…..
4. 總結:
第一種方法,易於跟蹤調試,但是效率低下,適用於對可變函數(函數指針)的效率要求不高,但程序出錯的可能性較大(復雜),模板函數(Sum)本身很復雜,模板參數也比較復雜(add)的場合。
第二種方法,效率高,但很難跟蹤調試,在模板函數和模板參數本身都很復雜的時候更是如此。
第三種方法,是我最近幾天才想出的,我認為是最好的,在模板參數(Add)比較復雜時可以用函數(第二種也可以如此),簡單時可以用宏,並且,易於調試。在模板函數本身很復雜,而模板參數比較簡單時更為優越。但是,可能有點繁瑣。
一般情況下,沒有必要做如此勞心的工作,一切交給編譯器去做就行了。但是本人在開發一個文件系統時,由於是基於一種少見的平台,沒有可用的C++編譯器,有幾個函數,除了其中的類型不同(uint16和uint32),和幾個可參數化的宏不同,其它地方完全相同,而函數本身很復雜(兩百多行代碼)。Copy出幾個完全類似的函數副本,維護起來特別煩人。非常需要如此的編程模式,故此,分享出來,大家共同探討。