将std :: function对象分配给c函数指针

时间:2019-03-21 21:42:35

标签: c++

我有一个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库?

1 个答案:

答案 0 :(得分:0)

解决this问题的方法对我有所帮助。由于mc是全局的,因此无需将其传递给rdwr函数。

在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);                                                                                                                                                                                     
}