例子,但我似乎无法找出我的问题的解决方案。我有
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);
}
}