C API函数回调到C++成员函数代码中

bob*_*obo 10 c c++ fmod static-functions

所以,我正在使用FMOD api,它确实是一个C api.

不是那个坏或什么的.它只是它与C++代码没有良好的接口.

例如,使用

FMOD_Channel_SetCallback( channel, callbackFunc ) ;
Run Code Online (Sandbox Code Playgroud)

它想要一个C风格的函数callbackFunc,但我想传递一个类的成员函数.

我最终使用Win32技巧,使成员函数静态.然后它作为FMOD的回调.

现在我必须破解我的代码以使一些成员静态,只是为了解释FMOD的C-ness.

我想知道它是否可能在FMOD中或者是否有解决方法将回调链接到特定C++对象的实例成员函数(不是静态函数).它会更顺畅.

R S*_*hko 12

您无法直接传递成员函数.成员函数具有隐式参数,this而C函数则没有.

你需要创建一个蹦床(不确定回调的签名,所以这里只做一些随机的事情).

extern "C" int fmod_callback( ... args ...)
{
    return object->member();
}
Run Code Online (Sandbox Code Playgroud)

一个问题是该对象指针来自何处.希望fmod为您提供一个通用的上下文值,在您进行回调时将提供给您(然后您可以传入对象指针).

如果没有,您只需要将其设置为全局访问它.

  • @NeilButterworth - 我不记得我第一次听到这个被描述为"蹦床"的地方,但我使用的一个参考是维基百科(http://en.wikipedia.org/wiki/Trampoline_%28computers%29)`当接口时使用不兼容的调用约定的代码片段,trampoline用于将调用者的约定转换为被调用者的约定. (2认同)
  • @R Samuel Klatchko感谢您的链接.所以基本上我认为是"thunk"的另一个词. (2认同)

Den*_*s K 5

我猜它应该这样工作:
您可以通过调用将一些用户数据分配给频道FMOD_Channel_SetUserData.此用户数据应该是指向处理事件的C++对象的指针.然后你应该编写C风格的回调函数,通过调用提取该对象FMOD_Channel_GetUserData,然后在该对象上调用C++实例方法.