c語言函數模版 c++ 模版函數

c語言,函數,函數模板

那是C++自帶的模板庫,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沒有函數模版。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語言函數模板中的非類型參數問題

這些都是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。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管
主站蜘蛛池模板: 免费无码中文字幕A级毛片| 亚洲高清无码综合性爱视频| 亚洲国产AV无码专区亚洲AV| 国产精品无码不卡一区二区三区| 人妻无码久久中文字幕专区| 成人午夜精品无码区久久| 无码人妻一区二区三区免费n鬼沢| 人妻少妇精品无码专区二区| 无码区日韩特区永久免费系列| 欧洲黑大粗无码免费| 国产做无码视频在线观看浪潮| 亚洲av永久无码精品秋霞电影秋| 国产成人亚洲精品无码AV大片| 亚洲av成人无码久久精品| 久久亚洲中文字幕无码| 国产成人无码18禁午夜福利p | 亚洲国产一二三精品无码| 久久午夜无码免费| 日韩电影无码A不卡| 久久久久无码精品国产| 国产成人亚洲综合无码| 中文无码热在线视频| 最新中文字幕AV无码不卡 | 高h纯肉无码视频在线观看| 无码福利一区二区三区| 亚洲人成无码网站| 亚洲免费日韩无码系列 | 亚洲韩国精品无码一区二区三区| 国产精品亚洲专区无码牛牛| 亚洲成A人片在线观看无码不卡| 人妻老妇乱子伦精品无码专区 | 日韩人妻无码中文字幕视频| 免费人妻无码不卡中文字幕18禁| 少妇伦子伦精品无码STYLES| a级毛片无码免费真人久久| 精品乱码一区内射人妻无码| 国产乱妇无码大片在线观看| 无码专区—VA亚洲V天堂| 国产成人AV一区二区三区无码| 国产成人亚洲综合无码| 亚洲一级特黄无码片|