gpt4 book ai didi

C++ 对象函数到函数指针

转载 作者:搜寻专家 更新时间:2023-10-31 01:18:31 27 4
gpt4 key购买 nike

我在我的 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
}

我不能直接绑定(bind),基于这里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);
}

像这样在构造函数中绑定(bind)它:

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)。我考虑过将回调目标设为 BattleScreen* 的 vector ,我可以在 TopLevelHandleWebViewCallbacks 中迭代它并像这样进行比较:

if (callbacktargets[index]->GetWebview() == WebView)
{
callbacktargets[index]->HandleWebviewCallbacks(WebView, object, callback, arguments);
}

但这里的问题是我只比较 awe_webview 指针,这似乎是一个非常糟糕的主意。该库是封闭源代码,而 awe_webview 是 C 构造的,所以我看不出它们是由什么组成的,也看不出是否有任何属性可以进行更合适的比较。这个有好的解决办法吗?

如果我不清楚或者您需要更多信息,请告诉我。

提前致谢

最佳答案

回调接收 awe_webview 指针的事实或多或少证明了比较它们是他们希望您做的。

但是,我会修改您的解决方案以在 Web View 与 BattleScreens 之间使用全局映射:

static std::map<awe_webview*, BattleScreen*> gWebViewBattleScreen;

然后有一个全局回调从中挑选 BattleScreen 对象并调用它的方法:

static void webviewCallback(awe_webview* caller, ......)
{
if (gWebViewBattleScreen.find(caller) != gWebViewBattleScreen.end())
gWebViewBattleScreen[caller]->HandleWebViewCallbacks(......)
}

Nice 库允许您通过回调传递上下文指针,因此您可以为您设置的每个回调分配诸如 BattleObject* 之类的东西:

void set_nice_callback(void (*callback)(Params params, void* context), void* context);

您正在使用的库似乎不是很好 :) 您可能需要向其开发人员指出这一点。

关于C++ 对象函数到函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7055669/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com