我发现了几个类似的问题,但解决方案并不适合我的情况。 在C ++方法中,我调用一个C api,它将回调作为其参数之一。
class A
{
herr_t methodA(some parameters) {....}
void methodB(some parameters)
{
....
int status = CAPI(other parameters, callback, last parameter);
}
};
CAPI的原型是
herr_t CAPI( some parameters, H5L_iterate_t op, other parameters);
H5L_iterate_t由
定义herr_t (*H5L_iterate_t)( hid_t g_id, const char *name,
const H5L_info_t *info, void *op_data)
方法A与H5L_iterate_t具有相同的签名 在methodB中,
status = CAPI(..., **(H5L_iterate_t )std::bind(&A::methodA, this,
std::placeholders::_1)**, ...);
我得到的编译错误是"无法从...转换为H5L_iterate_t"。我想知道将非静态成员函数作为回调传递的正确方法是什么。
提前致谢。
答案 0 :(得分:2)
提供回调的C API几乎总是遵循这种模式:
extern "C"
{
typedef void(*callback_function)(void* data);
typedef int handle_type;
void do_something_with_callback(handle_type, callback_function, void *data);
}
在调用data
时,无论你传递的do_something_with_callback
参数是什么,都会被传递给callback_function
。
您可以使用此用户数据传递指向c ++对象地址的指针,然后您可以将其转换回指向对象类型的指针:
struct my_object
{
void initiate()
{
// call the C interface, passing our c-style callback function with
// a pointer to this class as the user data
do_something_with_callback(handle_, &callback_launch_function, this);
}
private:
static void callback_launch_function(void * data) {
// the data will always be a pointer to my_object -
// because that's what we passed.
auto self = reinterpret_cast<my_object*>(data);
self->handle_it();
}
// this is our c++style callback
void handle_it()
{
}
handle_type handle_;
};