我在制作需要由第三方库使用的回调包装类方法时遇到了一些麻烦; JackAudio library .
我已经能够为需要两个参数的 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();
}
但我得到错误:从类型“const char*”到类型“SoundClass*”的无效 static_cast
我明白为什么会发生这种情况,只是不知道如何解决。
在此先感谢您的帮助。
最佳答案
假设 Jack API 是为 C 语言编写的,您的工作回调已经存在正式问题。即它需要是 extern "C"
,而作为静态成员函数则不能。因此,从形式上讲,它需要是一个独立的功能。
documentation您链接到的 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 库?
关于c++ - 用于包装类方法的回调函数和 static_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14016519/