能不能让编译器做循环的?

jinlking 2011-04-19 09:25:03
有一个数组,包含N个元素,要根据这个数组生成对应的N个函数,函数的名字和参数都和这个数组有关,有米有这样的实现方式。
...全文
152 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2011-04-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 healer_kx 的回复:]
再研究一下MFC的那些宏。
引用 1 楼 bdmh 的回复:

函数指针数组
[/Quote]
++
  • 打赏
  • 举报
回复
boost Preprocessor
jinlking 2011-04-19
  • 打赏
  • 举报
回复
能不能具体一点
[Quote=引用 7 楼 selooloo 的回复:]

模板或者 宏
[/Quote]
gangyilovevc 2011-04-19
  • 打赏
  • 举报
回复
动态生成不太现实,但可以动态调用。

case Commnd_Self:
{ //我们只保存函数地址,所以得自己实现函数调用,模拟CALL指令
DWORD *dwThis = (DWORD*)this;
__asm
{
mov ebx,dword ptr [pCommnd]
mov edx,[ebx].lpCommndData
mov eax,dword ptr [edx] ;得到函数地址
mov ecx, dword ptr [dwThis] ;模拟this指针
call eax ;调用函数,无参
}
}
如果你是这种需求,我博客里面有一篇手势文章,你可以参考下。
selooloo 2011-04-19
  • 打赏
  • 举报
回复
模板或者 宏
jinlking 2011-04-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tulipcaicai 的回复:]

动态生成函数?看看这个是不是你想要的吧。
http://www.52rd.com/blog/Detail_RD.Blog_zjhfqq_7228.html
[/Quote]

打不开啊,能不能贴出来看看
tulipcaicai 2011-04-19
  • 打赏
  • 举报
回复
动态生成函数?看看这个是不是你想要的吧。
http://www.52rd.com/blog/Detail_RD.Blog_zjhfqq_7228.html
jinlking 2011-04-19
  • 打赏
  • 举报
回复
函数指针也要定义这么多的函数啊,我就不想写这么多的函数,因为每个函数都一样的,就是有点细微的差别,更具数组完全可以区分开。
quwei197874 2011-04-19
  • 打赏
  • 举报
回复
http://blog.csdn.net/wang_apls/archive/2009/02/26/3940746.aspx
healer_kx 2011-04-19
  • 打赏
  • 举报
回复

再研究一下MFC的那些宏。
[Quote=引用 1 楼 bdmh 的回复:]

函数指针数组
[/Quote]
bdmh 2011-04-19
  • 打赏
  • 举报
回复
函数指针数组
qq120848369 2011-04-19
  • 打赏
  • 举报
回复
C++利用多态,派生各种各样的仿函数体,利用map做函数名到仿函数体对象指针的映射,从而可以根据函数名直接调用相关函数。

如果为了提供统一的使用接口,可以提供一个函数接口,用宏函数进行包装其调用过程(即宏字符串的转化)。
xmu_才盛 2011-04-19
  • 打赏
  • 举报
回复
如果要是数组的话, 宏会结合数组变量名称接, 而不是数组的值,即字符串类型。 所以貌似真的不能通过字符串数组来实现 反射。。

即不太可能直接通过 循环 szName[i] 来实现函数的调用,如果这样的技术mfc早普及了。。。

所以想多了, c++还没这么智能。。。

以后如果发现相应的技术,我会发上来
xmu_才盛 2011-04-19
  • 打赏
  • 举报
回复
改成这样也行
#define DOSOMETHING(class_name, nA, nB){ \
CBase* pBase = new C##class_name;\
C##class_name::print(pBase, Symbol2Str(class_name), nA, nB);\
delete pBase;}
xmu_才盛 2011-04-19
  • 打赏
  • 举报
回复
由于没办法把字符串类型 用宏的方式与 定义链接起来, 所以目前只能用这种方式,可以把宏转换成为字符串,但是反过来不行

class CBase
{
public:
virtual int doSomething(int nA, int nB) = 0;

static void print(CBase* pBase, char* pBelong, int nA, int nB)
{
printf("类C%s 计算 = %d\n", pBelong, pBase->doSomething(nA, nB));
}
};
class CAdd: public CBase
{
public:
// 加法
virtual int doSomething(int nA, int nB){return nA + nB;}
};
class CMuty: public CBase
{
public:
// 乘法
virtual int doSomething(int nA, int nB){return nA * nB;}
};
class CDiv: public CBase
{
public:
// 除法
virtual int doSomething(int nA, int nB){return nA / nB;}
};


enum VALUE{ADD, Muty, Div};
#define Symbol2Str(s) (#s)
#define DOSOMETHING(class_name, nA, nB){ \
CBase* pBase = new C##class_name;\
CBase::print(pBase, Symbol2Str(class_name), nA, nB);\
delete pBase;}


int main()
{
int nA = 100,nB = 10;

DOSOMETHING(Add, nA, nB);
DOSOMETHING(Muty, nA, nB);
DOSOMETHING(Div, nA, nB);

getchar();
return 0;
}
Defonds 2011-04-19
  • 打赏
  • 举报
回复
动态添加函数。。。
xmu_才盛 2011-04-19
  • 打赏
  • 举报
回复
反正怎么都没java c#智能,, 只能通过一些现有的机制 拼装。。
xmu_才盛 2011-04-19
  • 打赏
  • 举报
回复
生成n个函数不可能, c++不可能在运行期让你再向代码段添加东东。。。
函数指针倒是可以,。 或者函数是你已经写好的

函数指针实现:Name存储 函数名称,func存函数指针
for (int i = 0; i < N; i ++)
{
if(strcmp(Name[i], "func1") == 0)
func[1]();
}

宏实现:前提你已经写好了 My***()类型的一系列函数
#define FUNC_USE(func_name) \
My## func_name ();

for (int i = 0; i < N; i ++)
{
if(strcmp(Name[i], "func1") == 0)
FUNC_USE(Name[i]);
}

或者用mfc实现方法, 仅供参考

class CBase
{
public:
virtual int doSomething(int nA, int nB) = 0;
};
class CAdd: public CBase
{
public:
// 加法
virtual int doSomething(int nA, int nB){return nA + nB;}
};
class CMuty: public CBase
{
public:
// 乘法
virtual int doSomething(int nA, int nB){return nA * nB;}
};
class CDiv: public CBase
{
public:
// 除法
virtual int doSomething(int nA, int nB){return nA / nB;}
};
#define DOSOMETHING(class_name) \
new C##class_name;\

int main()
{
CBase* pBase = NULL;
int nA = 100,nB = 10;

pBase = DOSOMETHING(Add);
printf("Add 计算 = %d\n", pBase->doSomething(nA, nB));
delete pBase;
pBase = DOSOMETHING(Muty);
printf("Muty 计算 = %d\n", pBase->doSomething(nA, nB));
delete pBase;
pBase = DOSOMETHING(Div);
printf("Div 计算 = %d\n", pBase->doSomething(nA, nB));
delete pBase;

getchar();
return 0;
}
pathuang68 2011-04-19
  • 打赏
  • 举报
回复
楼主想动态生成函数?那生成的规则是怎样的?举两个例子说明一下。
tulipcaicai 2011-04-19
  • 打赏
  • 举报
回复
下文源自:http://www.52rd.com/blog/Detail_RD.Blog_zjhfqq_7228.html

函数指针数组 (2007-4-3 15:43)
关于函数指针数组的定义


关于函数指针数组的定义方法,有两种:一种是标准的方法;一种是蒙骗法。

第一种,标准方法:

{
分析:函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是是一个数组,且其元素是一个指向函数入口地址的指针。
根据分析:首先说明是一个数组:数组名[]
其次,要说明其元素的数据类型指针:*数组名[].
再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型 (*数组名[])().请注意,这里为什么要把“*数组名[]”用括号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向,那么 *数组名[]() 说明的是什么呢?是元素返回值类型为指针的函数数组。有这样的函数数祖吗?不知道。所以必须括起来,以保证数组的每一个元素是指针。

}

第二种,蒙骗法:

尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。获取函数方法是:用不带有括号和参数的函数名得到。
函数名相当于一个指向其函数入口指针常量。 那么既然函数名是一个指针常量,那么就可以对其进行一些相应的处理,如强制类型转换。
那么我们就可以把这个地址放在一个整形指针数组中,然后作为函数指针调用即可。


完整例子:
#include "stdio.h"
int add1(int a1,int b1);

int add2(int a2,int b2);

int main(int argc,char* argv[])

{

int numa1=1,numb1=2;

int numa2=2,numb2=3;

int (*op[2])(int a,int b);

op[0]=add1;

op[1]=add2;

printf("%d %d\n",op[0](numa1,numb1),op[1](numa2,numb2));

getch();

}

int add1(int a1,int b1)

{

return a1+b1;

}

int add2(int a2,int b2)

{

return a2+b2;

}


再给出常用的C变量的定义方式:
a) 一个整型数(An integer)
b) 一个指向整型数的指针(A pointer to an integer)
c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)
d) 一个有10个整型数的数组(An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)
f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an

integer )

答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧