我在制作需要由第三方库使用的回调包装器类方法时遇到了一些麻烦; 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();
}
但我得到
error: invalid static_cast from type ‘const char*’ to type ‘SoundClass*’
我明白了为什么会这样,我只是不知道该怎么做。
在此先感谢您的帮助。
最佳答案
假设Jack API是用C语言编写的,那么您使用的回调函数已经存在一个正式的问题。也就是说,然后它需要是extern "C"
,而作为静态成员函数则不能。因此,从形式上讲,它必须是一个独立的功能。
您链接到jack_set_error_function
的documentation提供了此签名,大概用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/