我有一个数据源的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函数指针?
答案 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);