我在我的 C++ 应用程序中使用了一个 C 库。该库具有具有以下签名的函数:
void awe_webview_set_callback_js_callback(awe_webview* webview, void (*callback)(awe_webview* caller, const awe_string* object_name, const awe_string* callback_name, const awe_jsarray* arguments));
我正在尝试将函数设置为回调,我希望能够使用以下类成员函数
void BattleScreen::HandleWebViewCallbacks(awe_webview* WebView, const awe_string* object, const awe_string* callback, const awe_jsarray* arguments)
{
//handling code
}
我不能直接绑定它并基于这里http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.2我有一个可能的解决方案,我会创建一个静态成员来处理回调(因为基于该站点,应该没问题)并添加此类的静态实例以供静态成员调用。
即在BattleScreen中添加以下内容:
static BattleScreen* callbacktarget;
static BattleScreen::TopLevelHandleWebViewCallbacks(awe_webview* WebView, const awe_string* object, const awe_string* callback, const awe_jsarray* arguments)
{
callbacktarget->HandleWebviewCallbacks(WebView, object, callback, arguments);
}
像这样在构造函数中绑定它:
awe_webview_set_callback_js_callback(this->GetWebView(), static_cast<void (*)(awe_webview*, const awe_string*, const awe_string*, const awe_jsarray*)>(&BattleScreen::TopLevelHandleWebViewCallbacks));
并将对象分配给构造函数中的回调目标。
BattleScreen::callbacktarget = this;
问题是我无法知道我在任何时候都会有多少这样的课程(它会是最小的,但可能大于 1)。我考虑让 callbacktarget 成为 BattleScreen* 的向量,我可以在 TopLevelHandleWebViewCallbacks 中迭代并像这样进行比较:
if (callbacktargets[index]->GetWebview() == WebView)
{
callbacktargets[index]->HandleWebviewCallbacks(WebView, object, callback, arguments);
}
但这里的问题是我只是在比较 awe_webview 指针,这似乎是一个非常糟糕的主意。该库是封闭源代码,awe_webview 是 C 结构,所以我看不出它们是由什么组成的,以及是否有任何属性可以进行更合适的比较。有没有好的解决方案?
如果我不清楚或者您需要更多信息,请告诉我。
提前致谢