社区
C语言
帖子详情
如何将类型作为参数传递
jiongdy
2006-12-31 10:19:46
我想用C实现如下功能:
void test(类型)
{
根据传入的类型,定义对应类型的变量;
}
而且不采用swtich case 语句。
实际上就是想实现C++中模板的功能。
请问各位有何高见!
...全文
845
18
打赏
收藏
如何将类型作为参数传递
我想用C实现如下功能: void test(类型) { 根据传入的类型,定义对应类型的变量; } 而且不采用swtich case 语句。 实际上就是想实现C++中模板的功能。 请问各位有何高见!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cqpp
2007-01-26
打赏
举报
回复
typedef struct
{
int line;
int row;
void* content;
void (*op_f[xxx])( void* dest, void* src1, void* src2 );
}Matrix;
构造的时候同时初始化操作方法。
后来是用就用 matrix.op_f[OP_COPY](...) 后来是用就用 matrix.op_f[OP_ADD](...) ...
猫腻儿姐姐
2007-01-26
打赏
举报
回复
似乎只有模板技术中类型才可以作为参数!
doubhor
2007-01-25
打赏
举报
回复
C++中的模板行为发生在编译阶段,这时候编译器做了一个类似替换的行为,生成了一系列的函数。
C++中的虚函数也可以实现根据不同类型做不同处理的能力,是靠虚函数表实现的。
所以怎么实现关键是看你要达到什么目标,在不能改变编译器行为前提下,可以采用类似虚函数表的做法,在某一个地方设置一个函数指针,然后这个指针随不同类型而不同。
由于不知道你要实现什么功能,所以不好写出更加详细的代码。
完全模拟模板是非常困难,甚至在一定情况下是不可能的,能够达到自己的目的就可以了。
jiongdy
2007-01-04
打赏
举报
回复
高手都到哪去了?
netxuning
2007-01-04
打赏
举报
回复
学习...
jiongdy
2007-01-04
打赏
举报
回复
自己再顶一下
jiongdy
2007-01-03
打赏
举报
回复
楼上的方法实际上是统一按照int类型来处理数据的,
我现在改用memcpy的方式,没有什么问题了
Matrix MConstruct2(int line,int row,PrivateType type)
{
Matrix temp;
temp.line=line;
temp.row=row;
temp.type = type;
temp.content = malloc(line*row*type);
return temp;
}
Matrix MConstruct(Matrix A)
{
Matrix temp;
temp.line=A.line;
temp.row=A.row;
temp.type=A.type;
temp.content=malloc(A.line*A.row*A.type);
memcpy(temp.content,A.content,A.line*A.row*A.type);
return temp;
}
但是如果我要对矩阵里的数据进行+、-运算
又有困难了,还请大家多想想看
youjing243
2007-01-03
打赏
举报
回复
你可以定义一个枚举,不过需要使用switch,基本实现功能,不过在测试STRING的时候会出现戏剧性的结果,我也不清楚原因,呵
#include <stdio.h>
#include <stdlib.h>
typedef enum {CHAR=1,INT=4,DOUBLE=8,STRING=12}PrivateType;
typedef struct
{
void* content;
int line;
int row;
PrivateType type;
}Matrix;
Matrix MConstruct2(int line,int row,PrivateType type)
{
Matrix mat;
mat.line=line;
mat.row=row;
mat.type=type;
mat.content = malloc(line*row*type);
return mat;
}
//clone
Matrix MConstruct(Matrix A)
{
Matrix new_mat;
int i;
int *mat_ptr;
new_mat.line=A.line;
new_mat.row=A.row;
new_mat.type=A.type;
new_mat.content=malloc(A.line*A.row*A.type);
mat_ptr=(int *)new_mat.content;
for (i=0;i<A.line*A.row;i++)
mat_ptr[i]=*((int*)(A.content)+i);
return new_mat;
}
测试代码如下:
int main(int argc, char *argv[])
{
Matrix mat;
Matrix mat_clone;
int i;
char *tmp="youjing243";
PrivateType type=CHAR;
mat=MConstruct2(4,4,type);
for(i=0;i<mat.line*mat.row;i++)
{
switch(mat.type)
{
case INT:
*((int *)mat.content+i)=1;
break;
case CHAR:
*((char *)mat.content+i)='A';
break;
case DOUBLE:
*((double *)mat.content+i)=3.14;
break;
case STRING:
strcpy((char *)((char *)mat.content+i),tmp);
break;
}
}
for(i=0;i<mat.line*mat.row;i++)
{
switch(mat.type)
{
case INT:
printf("%d\t",*((int *)mat.content+i));
break;
case CHAR:
printf("%c\t",*((char *)mat.content+i));
break;
case DOUBLE:
printf("%d\t",*((double *)mat.content+i));
break;
case STRING:
printf("地址:%p\t",((char *)mat.content+i));
printf("值:%8s\n",(char *)((char *)mat.content+i));
break;
}
}
printf("\n行:%d,列:%d\n\n\n",mat.line,mat.row);
mat_clone=MConstruct(mat);
for(i=0;i<mat_clone.line*mat_clone.row;i++)
{
switch(mat_clone.type)
{
case INT:
printf("%d\t",*((int *)mat_clone.content+i));
break;
case CHAR:
printf("%c\t",*((char *)mat_clone.content+i));
break;
case DOUBLE:
printf("%d\t",*((double *)mat_clone.content+i));
break;
case STRING:
printf("地址:%p\t",((char *)mat_clone.content+i));
printf("值:%8s\n",(char *)((char *)mat_clone.content+i));
break;
}
}
printf("\n行:%d,列:%d",mat_clone.line,mat_clone.row);
getchar();
system("PAUSE");
return 0;
}
jiongdy
2007-01-02
打赏
举报
回复
关键是要把类型作为实参传到函数里啊
我贴一下简单的代码如下:
#define INT sizeof(int)
#define DOUBLE sizeof(double)
typedef struct
{
void* content;
int line;
int row;
int type;//这里不知道该怎么定义好?
}Matrix;
//构造对应类型的矩阵
Matrix MConstruct2(int line,int row,int type)
{
Matrix temp;
temp.line=line;
temp.row=row;
temp.uType = type;
temp.content = malloc(line*row*type);
return temp;
}
//用一个矩阵构造相同新的矩阵
Matrix MConstruct(Matrix A)
{
Matrix temp;
int i;
temp.line=A.line;
temp.row=A.row;
temp.type=A.type;
temp.content=malloc(A.line*A.row*A.type);
//现在要对temp1.content进行赋值,麻烦就来了,下面是按int类型赋值的,怎么改好呢?
temp1=(int *)temp.content;
for (i=0;i<A.line*A.row;i++)
temp1[i]=*((int*)(A.content)+i);
return temp;
}
不知道能否实现?
还请高手们帮想一想。
smileflyer
2007-01-02
打赏
举报
回复
宏是个办法!
cqpp
2006-12-31
打赏
举报
回复
只有用其他方法实现了你要求了!这条路是不行的
柯本
2006-12-31
打赏
举报
回复
即使能判断到类型,C也不能在运行时在程序中定义变量,C++的template是由编译器实现的
珍惜生命远离CPP
2006-12-31
打赏
举报
回复
C语言估计做不到
晨星
2006-12-31
打赏
举报
回复
呵呵,他问的是C语言。
ouyh12345
2006-12-31
打赏
举报
回复
得模拟继承。
晨星
2006-12-31
打赏
举报
回复
估计做不到。
lauxp
2006-12-31
打赏
举报
回复
template不用,想在runtime搞?
目前唯一的办法:C++重新设计为动态语言
seas110
2006-12-31
打赏
举报
回复
#define Type(type){type temp;}
typedef int ch;
Type(ch);
为什么“Linux”系统比“Windows”安全 呢?珍爱生命,远离微软!
为什么“Linux”系统比“Windows”安全 呢?珍爱生命,远离微软! 2009-08-24 20:27 (分类:默认分类) 很多人都知道Linux系统的安全性比微软Windows系统更高。但是,为什么会是这样?这种说法到底有没有道理?却很少有人能回答得出来。 为了搞清楚这个问题,首先,我们必须要明确“安全性”的定义。其实,绝大多数人都犯了同样一个
二十一世纪Windows简史
摘要:Windows拥有者超过90%的消费级操作系统市场份额,处于龙头老大的位置,那其成长的故事是怎么的?ZDNet总结了21世纪Windows的发展史,以及围绕微软操作系统发生的事情,不妨一看。 据微软4月26日的官方通知,IE浏览器中存在重大漏洞,攻击者可利用该漏洞在 IE 用户的计算机上安装恶意软件,进而窃取数据或控制用户计算机。该漏洞存在于从IE 6至IE 11的所有版本的 IE 浏览器
GPT-5能力解码:从微软Copilot更新反向推演大模型落地新范式
大语言模型(LLM)正从‘能说会写’迈向‘可信赖、可审计、可集成’的工程化阶段。其核心演进逻辑已不再局限于参数规模或训练数据量,而是聚焦于长上下文连贯性、多模态语义对齐、输出确定性保障等底层能力突破。这些能力并非孤立存在,而是通过微软Copilot等企业级终端完成真实场景的压力验证与封装交付——例如合同跨文档逻辑校验、网页图文代码联合理解、SLA级响应稳定性等。这意味着开发者无需等待API开放,即可基于Copilot更新日志反向解码GPT-5的实际能力边界,并提前开展架构冗余评估、能力映射审计与灰度接入准备
六大原因 为何Linux比Windows更安全
很多人都知道Linux系统的安全性比微软Windows系统更高。但是,为什么会是这样?这种说法到底有没有道理?却很少有人能回答得出来。 为了搞清楚这个问题,首先,我们必须要明确“安全性”的定义。其实,绝大多数人都犯了同样一个错误,那就是孤立地认为某个产品比较安全。比如,Linux系统要比微软Windows系统更加安全; 或是,开放源代码的Firefox网络浏览器要比微软IE浏览器更
windows系统盗版赔偿
了解版权法:熟悉所在国家或地区关于软件版权保护的相关法律规定是非常重要的第一步。这有助于个人和企业用户认识到未经许可复制、安装或者传播Windows操作系统属于违法行为。识别正版软件:学会辨别正版与盗版软件之间的差异对于防止无意间触犯法律至关重要。正版Windows产品通常会附带有效的授权证书及密钥;据此推断,在官方网站上也可以找到验证工具帮助确认所购买产品的真伪。通过正规渠道购买:无论是直接从微软官网还是授权经销商处获取Windows操作系统,确保选择可信赖的来源都是避免潜在风险的有效手段之一。
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章