У меня возникли проблемы с созданием метода класса оболочки обратного вызова, который должен использоваться сторонней библиотекой; Библиотека JackAudio.
Я был в состоянии сделать оболочку для функции обратного вызова JackAudio, которая нуждается в двух аргументах.
У меня просто возникают проблемы при создании функции обратного вызова для конкретной функции, которая нуждается в const char *
в качестве аргумента.
До сих пор я был в состоянии сделать библиотеку JackAudio jack_set_sample_rate_callback Функция использует пользовательский класс и может быть выполнена следующим образом:
SoundClass Sound;
SoundClass * SoundPointer = &Sound;
jack_set_sample_rate_callback(
client,
SoundClass::SampleRateCallbackWrapper,
SoundPointer
);
И класс выглядит примерно так:
SoundClass
{
int SampleRateCallback( jack_nframes_t nframes )
{
//executes some code when called.
}
static int SampleRateCallbackWrapper( jack_nframes_t nframes, void * arg )
{
return static_cast < SoundClass* > ( arg )->SampleRateCallback( nframes );
}
};
Все вышеперечисленное работает хорошо, без проблем.
Проблема у меня сейчас с функцией обратного вызова JackAudio jack_set_error_function
Вот что я попробовал:
static void ErrorCallbackWrapper( const char * arg )
{
return static_cast < SoundClass*>( arg )->SomeErrorFunction();
}
Но я получаю error: invalid static_cast from type ‘const char*’ to type ‘SoundClass*’
Я понимаю суть, почему это происходит, я просто не знаю, что делать для решения.
Заранее спасибо за любую помощь, ребята.
Предполагая, что Jack API написан для языка C, есть формальный проблема уже с рабочим обратным вызовом, который у вас есть. А именно, что тогда должно быть extern "C"
и что в качестве статической функции-члена это не может быть. Так что формально это должна быть автономная функция.
документация что вы ссылаетесь на jack_set_error_function
дает эту подпись, предположительно выраженную в C:
void jack_set_error_function( void(*)(const char *) func);
Для C ++ обратный вызов должен быть принят extern "C"
, так,
extern "C" void MyErrorFunction( char const* errorMessage )
{
// Whatever, e.g. post a message to the GUI event queue, or terminate.
}
Если вы хотите, чтобы эта функция в свою очередь вызывала метод для объекта, то, если библиотека не предоставляет какой-то специальный механизм, чтобы помочь вам, вам просто нужно использовать один из следующих методов:
переменная области имен пространства, к которой обращается обратный вызов, или
динамически генерируемый обратный вызов.
C ++ пока еще не поддерживает второй подход, так что первый четко обозначен — если Вы хотите обратный вызов метода объекта.
РЕДАКТИРОВАТЬК сожалению, я забыл упомянуть,
объявления функций в документации API синтаксически неверны.
Например. подпись документации
void jack_set_info_function( void(*)(const char *) func );
просто не будет компилироваться со стандартным компилятором. Не как C и не как C ++. Это синтаксически неверно на обоих языках.
Вместо этого должно быть
void jack_set_info_function( void(*func)(const char *) );
Поскольку документация, очевидно, генерируется DOxygen, очевидно, что она была сгенерирована из исходного кода, который компилируется. Если это так, то это ошибка в DOxygen и проблема с обеспечением качества библиотечного провайдера. Однако это может быть проблемой, которая лежит исключительно на поставщике библиотеки, или, я могу ошибаться в предположении, что это библиотека C?
Других решений пока нет …