c語(yǔ)言函數(shù)模板教程 c語(yǔ)言數(shù)學(xué)函數(shù)編程模板

在c語(yǔ)言中如何實(shí)現(xiàn)函數(shù)模板

各種用 C 語(yǔ)言實(shí)現(xiàn)的模板可能在使用形式上有所不同。現(xiàn)以一個(gè)求和函數(shù) Sum 為例,用 C++ Template 可寫(xiě)如下:

創(chuàng)新互聯(lián)公司的客戶來(lái)自各行各業(yè),為了共同目標(biāo),我們?cè)诠ぷ魃厦芮信浜?,從?chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對(duì)我們的要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。專業(yè)領(lǐng)域包括成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、電商網(wǎng)站開(kāi)發(fā)、微信營(yíng)銷、系統(tǒng)平臺(tái)開(kāi)發(fā)。

template R Sum(const T *array, int n)

{

R sum = 0;

for (int i = 0 ; i n ; ++i)

sum += i;

return sum;

}

如果不是內(nèi)置類型,該模板隱式地需要 有R R::operator+=(T)運(yùn)算符可用。

1. 使用函數(shù)指針作為 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 = 0 ; i n ; ++i)

self-add(self-sum, array + i*self-elemSize);

}

使用時(shí):

Void AddInt(char* r1, const char* r2) {

*(long*)r1 += *(int*)r2; }

AddClass addClass = {AddInt, 2, 0 };

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 = 0 ; i n ; ++i)

Add(sum, i);

return sum; }

使用時(shí):

#define AddInt(x, y) ((x) += (y))

GenSumFun(SumInt, AddInt, long, int) …..

Int array[100];

Read(array);

Long sum = SumInt(array, 100); …..

3. 所有可替換參數(shù)均為宏

至少需要一個(gè)額外的文件(實(shí)現(xiàn)文件)為 impsum.c

/* impsum.c */

RetType FunName(const ElemType *array, int n)

{

RetType sum = 0;

for (int i = 0 ; i n ; ++i)

Add(sum, i);

return sum; }

使用時(shí):

#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. 總結(jié):

第一種方法,易于跟蹤調(diào)試,但是效率低下,適用于對(duì)可變函數(shù)(函數(shù)指針)的效率要求不高,但程序出錯(cuò)的可能性較大(復(fù)雜),模板函數(shù)(Sum)本身很復(fù)雜,模板參數(shù)也比較復(fù)雜(add)的場(chǎng)合。

第二種方法,效率高,但很難跟蹤調(diào)試,在模板函數(shù)和模板參數(shù)本身都很復(fù)雜的時(shí)候更是如此。

第三種方法,是我最近幾天才想出的,我認(rèn)為是最好的,在模板參數(shù)(Add)比較復(fù)雜時(shí)可以用函數(shù)(第二種也可以如此),簡(jiǎn)單時(shí)可以用宏,并且,易于調(diào)試。在模板函數(shù)本身很復(fù)雜,而模板參數(shù)比較簡(jiǎn)單時(shí)更為優(yōu)越。但是,可能有點(diǎn)繁瑣。

c語(yǔ)言,函數(shù),函數(shù)模板

那是C++自帶的模板庫(kù),C的很少,而且代碼長(zhǎng)難記且功能少,基本可以忽略。

要是用C的話,函數(shù)基本要自己寫(xiě)的

C語(yǔ)言函數(shù)模板問(wèn)題

首先,C沒(méi)有函數(shù)模版。C++才有。

其次,template class T是函數(shù)聲明的一部分,所以下面函數(shù)實(shí)現(xiàn)應(yīng)該是:

template class T

void swap(T a,T b){

int temp;

temp=a;

a=b;

b=temp;

}

最后,#include iostream,在標(biāo)準(zhǔn)的C++函數(shù)中,std的域中已經(jīng)有一個(gè)swap函數(shù)。

而且前面也using namespace了。函數(shù)聲明重復(fù)。

兩個(gè)辦法:

1 swap(i,j);改為 ::swap(i,j); //全局化。

2 swap改個(gè)名字。

網(wǎng)頁(yè)名稱:c語(yǔ)言函數(shù)模板教程 c語(yǔ)言數(shù)學(xué)函數(shù)編程模板
本文來(lái)源:http://www.muchs.cn/article22/dosshcc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站建設(shè)做網(wǎng)站、商城網(wǎng)站、自適應(yīng)網(wǎng)站、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作