Я использую библиотеку 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, поэтому я не вижу, из чего они состоят, и есть ли какие-либо свойства, которые могли бы сделать более подходящее сравнение.Есть ли хорошее решение для этого?
Если мне неясно или вам нужна дополнительная информация, дайте мне знать.
Заранее спасибо