c语言,函数,函数模板那是C自带的模板库 , C的很少,而且代码长难记且功能少,基本可以忽略 。
要是用C的话,函数基本要自己写的
在c语言中如何实现函数模板各种用 C 语言实现c语言调用函数模板的模板可能在使用形式上有所不同 。现以一个求和函数 Sum 为例c语言调用函数模板,用 CTemplate 可写如下c语言调用函数模板:
template R Sum(const T *array, int n)
{
R sum = 0;
for (int i = 0 ; in ;i)
sum= i;
return sum;
}
如果不是内置类型c语言调用函数模板,该模板隐式地需要 有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 ; in ;i)
self-add(self-sum, arrayi*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 ; in ;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 = 0 ; in ;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语言写一模板函数,求任意两个数之和,并在主函数(main)中进行显式和隐式调用代码如下:
#include iostream
using namespace std;
// 加法的模板函数
template typename T
T Add(T a, T b)
{
return (ab);
}
// 测试函数
int main()
{
// 显式
cout"显式调用:"endl;
【c语言调用函数模板 c语言调用函数怎么写】int ia = 1, ib = 2, ic = 0;
ic = Addint(ia, ib);
coutia""ib" = "icendl;
// 隐式
cout"隐式调用:"endl;
float fa = 1.1f, fb = 2.2f, fc = 0.0f;
fc = Add(fa, fb);
coutfa""fb" = "fcendl;
coutendl;
return 0;
}
测试结果:
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语言调用函数怎么写、c语言调用函数模板的信息别忘了在本站进行查找喔 。
推荐阅读
- 主板带路由器怎么安装,主板带路由器怎么安装的
- 怎么下载京东,怎么下载京东金融
- pg数据库允许所有ip访问,数据库指定ip访问
- vb.net异常 vb常见错误类型及解决
- 家里千兆路由器怎么配猫,家中千兆路由器怎么安装
- 手机怎么看湖南卫视直播,手机怎么看湖南卫视直播电视
- 关于c语言多个函数同时运行的信息
- 招聘类小程序毕业设计,小程序 毕业设计
- 异地申请手机号怎么申请,异地申请手机号怎么办