函数指针问题
声明了一个函数指针,而指向的函数的参数类型不确定
指向的目标可能是多个函数,而这些函数的参数类型都不一样
现在只考虑参数的个数是相同的
如果参数个数不同?还能实现吗?
实现了加分!!!!!
问题点数:100、回复次数:23Top
1 楼iambic()回复于 2006-03-17 15:38:32 得分 14
传递void指针,拿到后强制类型转换。Top
2 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-03-17 15:45:45 得分 2
挺困难的。不如封装个仿函数对象。
class function
{
HRESULT PushParam(void* p);
HRESULT call();
}Top
3 楼shine51151(美丽心情)回复于 2006-03-17 15:45:52 得分 5
定义void型指针 然后调用哪个就强制类型转换成哪个 参数个数不一致的话就不清楚了 能力有限啊 不好意思Top
4 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-03-17 15:46:18 得分 2
faint,还让我给写错了。加个()重载。Top
5 楼firetoucher(风焱)回复于 2006-03-17 15:49:18 得分 5
晕,如果传入的参数是类或者结构又怎么办,如果传入的参数又是一个函数指针又怎么办?
介个......你的道道画的大一点了吧。
FT
--
Anything one man can imagine, other men can make real.Top
6 楼xbt746(头上无毛)回复于 2006-03-17 17:56:15 得分 0
传入的参数范围是int,bool,指针这些基本类型
呵呵,我知道有些难
,所以请大侠帮忙啊Top
7 楼sjjf(水晶剑锋)回复于 2006-03-17 19:03:20 得分 5
建议:优先考虑重载,
如果没法重载,那就所有的函数都用变参吧。这样应该能保证转化后"参数一致"
Top
8 楼xbt746(头上无毛)回复于 2006-03-17 19:35:18 得分 0
函数都是给定的,无法改变
我用了函数指针转换,但是,在函数中运算的,都是地址在运算
能不能用指针转换,但在函数中运算的是值而不是地址呢Top
9 楼xbt746(头上无毛)回复于 2006-03-17 19:35:27 得分 0
加分了Top
10 楼sjjf(水晶剑锋)回复于 2006-03-17 22:01:33 得分 30
int abc(int i ,int j)
{
cout<<"\n abc exec"<<i<<"asldkjfjke"<<j;
return i+j;
}
int edf(double i ,int j,int e)
{
cout<<"\n edf exec"<<i<<"---"<<j<<"===="<<e;
return i+j;
}
int main(int argc, char* argv[])
{
void * pFunc;
pFunc = abc;
((int (*)(int,int))pFunc)(1,2);
pFunc = edf;
((int (*)(double ,int ,int ))pFunc)(1.22,3,4);
}
如果不合要求,
把你的要求用代码的形势表达出来吧。
给个具体的例子(scene),告诉别人你要干吗,
单凭想象我无法想象出来你要干吗,
Top
11 楼ugg(逸学堂(exuetang.net))回复于 2006-03-18 10:34:10 得分 5
函数指针不是万能的,
如果函数指针不能解决问题,那么考虑自己设计是不是有问题,通过
设计避免这中问题。Top
12 楼fangrk(加把油,伙计!)回复于 2006-03-18 10:47:59 得分 5
如果有好的办法,告诉我一下。Top
13 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-03-18 10:50:06 得分 5
你可以去研究一下MFC的消息映射函数……Top
14 楼houdy(致力于图像/图形领域,成为有思想的程序员)回复于 2006-03-18 12:10:57 得分 0
好像Boost中有一个Function Object。这是一个模板类,可以实例化任何原型的函数。函数的原型是作为模板参数的。我觉得可以看看.Top
15 楼zncn2(embedded system)回复于 2006-03-18 13:07:17 得分 0
markTop
16 楼sjjf(水晶剑锋)回复于 2006-03-18 14:20:25 得分 3
boost好像花费了很大的力气实现了类似java的反射机制,但是没有研究过。Top
17 楼guyanhun(老婆说的都是对的!努力做个好老公!)回复于 2006-03-18 16:41:24 得分 3
模板
重载Top
18 楼guyanhun(老婆说的都是对的!努力做个好老公!)回复于 2006-03-18 16:50:03 得分 2
不一定要用函数指针啊。
template <int v>
struct Int2Type{
enum { value = v };
};
把那些函数重载,再用函数来根据模板中的整型参数调用对应某个函数。Top
19 楼xbt746(头上无毛)回复于 2006-03-18 17:31:47 得分 0
typedef int(SQRTPROC)(void *,void *);
HINSTANCE hInstance;
SQRTPROC *pFunction;
hInstance=LoadLibrary("CDllTemp.DLL");
if(hInstance!=NULL)
{
pFunction=(SQRTPROC *)::GetProcAddress(hInstance,"Add");
if(pFunction!=NULL)
{
m_total=(*pFunction)(&m_add1,&m_add2);
}
FreeLibrary(hInstance);
}
主要是想实现动态载入dll中的函数,而dll中的函数的参数类型又是不确定的
所以想用函数指针实现,大家的建议都很好,现在在期待更好的解决方法Top
20 楼sjjf(水晶剑锋)回复于 2006-03-18 18:50:43 得分 2
如果你想做到象反射一样的功能的话:根据传入的函数名字调用函数。
你还是问问,有没有精通boost的人吧,
这个问题java解决起来比较简单,
但是c/cpp就比较麻烦了。
听说boost用stl解决的。
两者的机制完全不一样,
没有研究过boost,不能给你答案Top
21 楼sjjf(水晶剑锋)回复于 2006-03-18 19:45:37 得分 2
http://www.codeproject.com/library/libreflection.asp
不知道这篇文章对你有没有帮助Top
22 楼sinkileu(小心)回复于 2006-03-18 20:21:50 得分 5
参数个数的问题可以用给参数提供默认值的方法解决吧?Top
23 楼guyanhun(老婆说的都是对的!努力做个好老公!)回复于 2006-03-18 20:33:49 得分 5
根据传入的函数名字调用函数 ?
这让我想到了stl 中的mapTop




