传递指向成员函数的指针


有很多

例子,但我似乎无法找出我的问题的解决方案。我有

class FooSource{
    ...
    void StartGetFoos(void (*callback)(vector<IFoo*>*, IAsyncResult));
    ...
}

当调用StartGetFoos()时,它为获取 Foos 而执行的请求,从而保存回调。 当请求完成(大约需要 30 秒)时,将调用保存的回调并显示结果。我无法更改此方法的签名。

在其他地方我有一堂课

class FooUser {
    ...
    void FooUser::MyCallback(vector<IFoo*>* foos, IAsyncResult result) 
    {
          // marshall to UI thread and update UI
    }
    void init()
    {
         fooUser->StartGetFoos(??????);
         // how do I pass my callback member function here?
    }
}

签名void (*callback)(vector<IFoo*>*, IAsyncResult)上没有任何地方可以接收this指针,因此无法使用成员函数。 相反,您必须使用 static 成员函数:

class FooUser {
    static void MyCallback(vector<IFoo*>* foos, IAsyncResult result) 
    {
          // marshall to UI thread and update UI
    }
    void init()
    {
         fooUser->StartGetFoos(&FooUser::MyCallback);
    }
};

这里的问题是您将无法访问FooUser上的任何实例数据;这可能是也可能不是问题。

根据 API 的设计程度,可能有一种方法可以传递实例指针,例如通过 IAsyncResult result

如果 IAsyncResult 是一个传入的数据结构,然后再次传出以用于操作,则可以使用自己的信息对其进行扩展。

class MyAsyncResult : public IAsyncResult
{
public:
   MyAsyncResult(FoorUser *sender) : sender(sender){}
   FooUser *sender;
};

然后,正如 ecatmur 所说,你可以为回调指定一个静态成员函数,但你也可以创建一个常规成员函数,该函数被称为后记:

静态成员函数无法访问类成员,但可以指定为通常需要普通 C 函数的回调。

class FooUser
{
    // static with no access to class members, but can be specified as a callback.
    static void MyCallback(vector<IFoo*>* foos, IAsyncResult *result) 
    {
          MyAsyncResult *res = (MyAsyncResult*)result;
          res->sender->MyCallback(foos, result);
    }
    void MyCallback(vector<IFoo*>* foos, IAsyncResult *result) 
    {
          // handle the actual callback here
    }
    void init()
    {
         IAsyncResult *res = new MyAsyncResult(this);
         fooUser->StartGetFoos(&foos, res);
    }
}

相关内容

  • 没有找到相关文章

最新更新