我有一个C库,该库提供用于注册回调的API。像这样
在clib.h
typedef int (*func_ptr)(int*);
void register_cb(func_ptr rd, func_ptr wr);
在clib.c
#include "clib.h"
static func_ptr r;
static func_ptr w;
void register_cb(func_ptr rd, func_ptr wr)
{
r = rd;
w = wr;
}
int main()
{
int b = 12;
if (r)
r(&b);
if (w)
w(&b);
return 0;
}
我必须将类成员函数作为对该C库的回调。我正在尝试做这样的事情
在MyClass.hpp
class MyClass {
private:
int v;
public:
int read (int *val)
{
*val = v;
return 0;
}
int write (int *val)
{
v = *val;
return 0;
}
};
void reg_callbacks ();
int rd (MyClass &mc, int* a);
int wr (MyClass &mc, int* a);
在test.cpp中,存在类型为MyClass的全局对象。我正在尝试使用全局对象将MyClass的成员函数传递给C库
#include "MyClass.hpp"
#include "clib.h"
#include <functional>
MyClass mc;
using fp = std::function<int(int*)>;
void reg_callbacks ()
{
using namespace std::placeholders;
fp r = std::bind(rd, mc, _1);
fp w = std::bind(wr, mc, _1);
register_cb(r.target<func_ptr>(), w.target<func_ptr>());
}
int rd (MyClass &mc, int* a)
{
return mc.read(a);
}
int wr (MyClass &mc, int *a)
{
return mc.write(a);
}
当我现在尝试编译test.cpp时,出现此错误
$ g++ -std=c++11 -c test.cpp
test.cpp: In function _void reg_callbacks()_:
test.cpp:14:59: error: cannot convert _int (**)(int*)_ to _func_ptr {aka int (*)(int*)}_ for argument _1_ to _void register_cb(func_ptr, func_ptr)_
register_cb(r.target<func_ptr>(), w.target<func_ptr>());
^
有人可以告诉我我在做什么错吗?有没有更好的方法将成员函数作为回调传递给C库?
答案 0 :(得分:0)
解决this问题的方法对我有所帮助。由于mc是全局的,因此无需将其传递给rd
和wr
函数。
在MyClass.hpp
class MyClass {
private:
int v;
public:
int read (int *val)
{
*val = v;
return 0;
}
int write (int *val)
{
v = *val;
return 0;
}
};
void reg_callbacks ();
int rd (int* a);
int wr (int* a);
在test.cpp
#include "MyClass.hpp"
#include "clib.h"
MyClass mc;
void reg_callbacks ()
{
register_cb(rd, wr);
}
int rd (int* a)
{
return mc.read(a);
}
int wr (int *a)
{
return mc.write(a);
}