我正在尝试将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