永发信息网

在c语言中如何实现函数模板

答案:5  悬赏:30  手机版
解决时间 2021-04-04 16:42
在c语言中如何实现函数模板
最佳答案
各种用 C 语言实现的模板可能在使用形式上有所不同。现以一个求和函数 Sum 为例,用 C++ Template 可写如下:
template R Sum(const T *array, int n)
{
R sum = 0;
for (int i = 0 ; 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 = 0 ; 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, 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; }
使用时:
#define AddInt(x, y) ((x) += (y))
GenSumFun(SumInt, AddInt, long, int) …..
Int array[100];
Read(array);
Long sum = SumInt(array, 100); …..
3. 所有可替换参数均为宏
至少需要一个额外的文件(实现文件)为 impsum.c

RetType FunName(const ElemType *array, int n)
{
RetType sum = 0;
for (int i = 0 ; 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)比较复杂时可以用函数(第二种也可以如此),简单时可以用宏,并且,易于调试。在模板函数本身很复杂,而模板参数比较简单时更为优越。但是,可能有点繁琐。
全部回答
没有吧?我还没见过
#include
#include
typedef int ElemType;
ElemType add(const void *a,const void *b)
{
return *((ElemType *)a)+*((ElemType *)b);
}
void main()
{
void *x1,*x2;
int a=1,b=2;
void *y1="3",*y2="4";
x1=&a;
x2=&b;
printf("%d\n",add(x1,x2));
printf("%d\n",add(y1,y2));
}
以add()函数上函数实现了int类型和char类型的共同借口。
利用void类型来实现c函数重载,在某种意义上可以减少代码量。
那是C++自带的模板库,C的很少,而且代码长难记且功能少,基本可以忽略。
要是用C的话,函数基本要自己写的
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
生活离不开化学物质.现有以下六种物质:①生
怎么进滁州二中宏志班
洛阳离开封有多远 15分
1996年中医大专自考毕业生用考助理吗?
表示心态的词语
The school often many books and magazines
牛顿全名是什么?
单选题日本政府在“二十一条”中提出:“中国
汕头哪有定做普宁布仔豆干?
我女朋友让我给他买内衣内裤能是什么意思呢?
JQ戏是什么
方程解,只列式,不用解
git是干嘛用的
如图,在△ABC中,AD平分∠BAC,过B作BE⊥AD
白色车耐脏吗,买汽车 白色好看 还是红色好看
推荐资讯
做蛋白线提升可以打麻药吗?
我想用带辉和珍的主一个成语
金昌到临河开车怎么走好
发泄心里不痛快的句子,发泄心中怒火的古诗词
骑车摔倒后眉毛摔没了,还能长出来吗.
好朋友祝福结婚的话语,朋友结婚祝福语大全
什么地喊着,什么地喊着?
每个人体内基因数目一样吗
我男,十五岁了1米68还能在长多高啊
为什么锂电负极极耳用镍或铜镀镍,而不用铜
商务车和GL8汽车哪个好
如图所示为LC振荡电路中电容器极板上的电量q
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?