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));
コンストラクターでオブジェクトをcallbacktargetに割り当てます。
BattleScreen::callbacktarget = this;
問題は、一度にこれらのクラスがいくつあるかを知る方法がないことです(最小になりますが、1より大きくなる可能性があります)。callbacktargetをBattleScreen*のベクトルにして、TopLevelHandleWebViewCallbacks内で反復処理し、次のように比較できるようにすることを検討しました。
if (callbacktargets[index]->GetWebview() == WebView)
{
callbacktargets[index]->HandleWebviewCallbacks(WebView, object, callback, arguments);
}
しかし、ここでの問題は、私がawe_webviewポインターを比較しているだけであり、これは本当に悪い考えのように思われることです。ライブラリはクローズドソースであり、awe_webviewはC構造であるため、それらを構成するものと、より適切な比較を行うプロパティがあるかどうかを確認できません。これに対する良い解決策はありますか?
不明な点がある場合、または追加情報が必要な場合はお知らせください。
前もって感謝します