[英]Passing a pointer to member function
有很多示例,但是我似乎無法找出解決問題的方法。 我有
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.