很抱歉提出这样一个问题,因为我确信它之前已经得到了解答,但是我很难找到答案,而且不是因为想要寻找......反正..
class foo
{
void read(void (*func)(obj&))
{
// many things happen to obj...
(*func)(obj); // Calls the function pointer to the handler.
}
};
class bar : public foo
{
void handler(obj&)
{
//
}
};
void main()
{
foo f;
typedef void (foo::*funcptr)(obj&);
funcptr ptr = &foo::handler;
f.read(ptr); ????
}
基本上,我所要做的就是将名为handler的非静态成员方法作为函数指针传递给read方法,这样当执行回调时,就会调用该处理程序。
我已经尝试了各种方法来完成这项工作,并且不想制作静态方法(原因我不会介绍)。我觉得我很亲密,但最后有点堕落了!任何帮助将不胜感激。
答案 0 :(得分:1)
你不能这样做:与可以自己调用的静态函数不同,成员函数的调用需要知道两件事 - 被调用的函数和调用它的对象。这就是为什么不能将成员函数传递给期望“普通”函数指针的API。
如果您无法访问foo
类的源,则可以创建一个静态函数,该函数调用存储在众所周知位置(即静态变量)中的对象的成员函数。如果这样做,请考虑更改API以获取函数对象,类似于标准C ++库中的函数。
最后,C库中使用了一种常用的方法,它接受函数指针 - 传递一个额外的void*
指针,它将在调用函数指针时传回; pthreads库可以做到这一点。如果是这种情况,您可以创建一个包装调用目标对象的struct
,并将指针传递给此struct
以传递回静态函数。
答案 1 :(得分:0)
AFAIK我不认为还有其他办法。您必须使该方法保持静态。