我正在嘗試將PlayFab C++ SDK包含到我的應用中。該SDK主要用於遊戲引擎Cocos2d-x,但基本上可用於任何C++應用程序。使用std :: function替換函數指針實現以在PlayFab SDK中使用lambdas
這只是普通的REST,因此您可以向服務器發送請求並等待響應。這對於使用lambda來說是完美的。
他們宣佈這個回調,被稱爲當一個請求成功:
template<typename ResType> using ProcessApiCallback = void(*)(const ResType& result, void* userData);
不幸的是,他們沒有使用std ::函數,而是一個函數指針。這樣就不能使用捕獲變量的lambda表達式。
因此,我想用的std ::回調函數,像這樣我可以簡單地替換這個函數指針回調:
template<typename ResType> using ProcessApiCallback = std::function<void(const ResType& result, void* userData)>;
不幸的是,事情沒有那麼簡單,因爲它們存儲在使用醜陋reinterpret_casts函數指針這裏有一個例子(去除不必要的部分,以保持它的簡稱):
void PlayFabClientAPI::LoginWithAndroidDeviceID(
LoginWithAndroidDeviceIDRequest& request,
ProcessApiCallback<LoginResult> callback,
ErrorCallback errorCallback,
void* userData
)
{
// here they assign the callback to the httpRequest
httpRequest->SetResultCallback(reinterpret_cast<void*>(callback));
httpRequest->SetErrorCallback(errorCallback);
httpRequest->SetUserData(userData);
PlayFabSettings::httpRequester->AddRequest(httpRequest, OnLoginWithAndroidDeviceIDResult, userData);
}
後來,當請求是成功的,他們這樣做:
if (request->GetResultCallback() != nullptr)
{
ProcessApiCallback<LoginResult> successCallback = reinterpret_cast<ProcessApiCallback<LoginResult>>(request->GetResultCallback());
successCallback(outResult, request->GetUserData());
}
的HttpRequest類具有這一領域:
void* mResultCallback;
的問題是,我不知道如何隨心所欲的std ::函數指針存儲在HttpRequest類再後來投他們回來。我嘗試了很多東西,包括也很醜陋的reinterpret_casting,但沒有任何工作。
我可以對其SDK進行任何更改。我也將這個報告稱爲糟糕的設計,他們同意,但他們沒有時間去改進它,但是如果能找到一個好的解決方案,他們會接受pull request。
你有C++ 17'的std :: any'或'提振:: any'?這些讓它變得簡單。 – Yakk
不幸的是,我只限於C++ 11,並且如果可能的話不會增加。 – keyboard