c++ - 用于包装类方法的回调函数和 static_cast

标签 c++ static-cast

我在制作需要由第三方库使用的回调包装类方法时遇到了一些麻烦; 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/

相关文章:

c++ - static_cast 和 Implicit_cast 有什么区别?

c++ - 枚举的 reinterpret_cast 错误

c++ - 无法通过 C++ 中的 OpenCV 拼接图像

c++ - 避免 C++ 类中的内存泄漏

c++ - 位域的内存位置

c++ - 将枚举数组转换为 int 指针

c++ - 将 float 转换为 int,还是将 int 转换为 float?

c++ - C2440 static_cast 无法从基类转换为派生类

c++ - 多次创建新结构

c++ - 如何在opencv中使用腐 eclipse 和扩张功能?