将非静态方法指针作为参数传递给另一个方法

时间:2013-05-09 01:50:30

标签: c++ methods static function-pointers

很抱歉提出这样一个问题,因为我确信它之前已经得到了解答,但是我很难找到答案,而且不是因为想要寻找......反正..

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方法,这样当执行回调时,就会调用该处理程序。

我已经尝试了各种方法来完成这项工作,并且不想制作静态方法(原因我不会介绍)。我觉得我很亲密,但最后有点堕落了!任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

你不能这样做:与可以自己调用的静态函数不同,成员函数的调用需要知道两件事 - 被调用的函数和调用它的对象。这就是为什么不能将成员函数传递给期望“普通”函数指针的API。

如果您无法访问foo类的源,则可以创建一个静态函数,该函数调用存储在众所周知位置(即静态变量)中的对象的成员函数。如果这样做,请考虑更改API以获取函数对象,类似于标准C ++库中的函数。

最后,C库中使用了一种常用的方法,它接受函数指针 - 传递一个额外的void*指针,它将在调用函数指针时传回; pthreads库可以做到这一点。如果是这种情况,您可以创建一个包装调用目标对象的struct,并将指针传递给此struct以传递回静态函数。

答案 1 :(得分:0)

AFAIK我不认为还有其他办法。您必须使该方法保持静态。