用于包装类方法的回调函数和static_cast
callback functions and static_cast for wrapping class methods
我有一些麻烦,使回调包装类方法需要由第三方库使用;
我已经能够为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++目前根本不支持第二种方法,因此第一种方法被强烈标识为& &;如果你想对一个对象的方法进行回调。
EDIT:对不起,我忘了说,
API文档中的函数声明在语法上无效。
。文档签名
void jack_set_info_function( void(*)(const char *) func );
不能使用符合标准的编译器进行编译。不像C,也不像c++。在两种语言中语法都无效。
应该是
void jack_set_info_function( void(*func)(const char *) );
由于文档显然是由氧生成的,因此它是由编译的源代码生成的。如果是这样,那么这就是oxygen中的一个bug,并且是库提供者的质量保证问题。然而,这可能是一个问题,仅仅在于库提供程序,或者,我可能错误地假设这是一个C库?
- 如何理解C++标准N3337中的expr.const.cast子句8
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- C++Cast运算符过载
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 收到错误"invalid use of non-static data member 'stu::n' "
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- "static char __ = []() -> char"的含义
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 无法在 DLL 中链接 SDL2-static.lib
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- C++线程"Call to non-static member function without an object argument"
- 出现这种错误的原因是什么"invalid use of non-static data member "
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- static是如何使用ClassA::m_variable处理所有类对象的
- 在[expr.static.cast]/4中,术语"一个可行函数"指的是什么