有很多例子,但我似乎无法找出问题的解决方案。我有
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?
}
}
答案 0 :(得分:3)
签名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
。
答案 1 :(得分:2)
如果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);
}
}