将实例方法传递给期望C函数指针的API

时间:2014-11-20 22:22:02

标签: c++

我有一个数据源的C API。要获得有关新数据可用的通知,请以函数指针的形式为API提供回调;数据进入时将调用您的回调.API的标题包含如下行:

struct DataRecord { ... };
typedef void (*DataCallback)(DataRecord *data);

void set_data_callback(DataCallback processor);

我的C ++类有一个带签名的实例方法

void MyClass::process_data(DataRecord *data);

在MyClass的构造函数中,我想将新实例的process_data方法设置为C API的数据回调。在this answer之后,我尝试在构造函数中编写此代码:

typedef void (MyClass::data_callback_t)(DataRecord*);
data_callback_t callback = &MyClass::process_data;
set_data_callback(callback);

当我这样做时,我收到错误

  

错误C2664:'set_data_callback':无法将参数2从'data_callback_t'转换为'DataCallback'

     

没有可以进行此转换的上下文

(我使用的是Visual C ++ 2010 Express,但我希望这没有什么区别。)

如何从实例和方法中提取C函数指针?

1 个答案:

答案 0 :(得分:1)

你做不到。 MyClass::process_data可以被认为是void(MyClass*, DataRecord*),这是错误的类型。你必须以某种方式将你的类指针包装到调用中。

一种方法可能是引入一个带有静态指针的类型:

struct MyClassCallbackHelper
{
    static MyClass* myClass;

    static void callback(DataRecord* record) {
        myClass->process_data(record);
    }
};

这样你就可以:

MyClassCallbackHelper::myClass = this;
set_data_callback(&MyClassCallbackHelper::callback);