类成员函数使用boost :: bind和boost :: function作为回调函数

jdt*_*141 7 c++ boost boost-bind boost-function

我正在设置一个成员函数作为我正在使用的C库的回调.C库设置如下的回调:

typedef int (*functionPointer_t)(myType1_t*, myType2_t*, myType3_t*);

setCallback(param1, param2, functionPointer, param4)
Run Code Online (Sandbox Code Playgroud)

我想使用boost :: bind(如果可能的话)传入函数指针.我希望指向的函数是实例化类的成员,而不是静态成员.例如

Class A {
 public: 
  A();
 protected:
  int myCallback(myType1_t*, myType2_t*, myType3_t*); //aka functionPointer_t
}
Run Code Online (Sandbox Code Playgroud)

可以使用boost :: bind和boost :: function来完成吗?Per 如何将类成员函数作为回调传递?(第3个答案)似乎我可以声明以下内容(某处或作为typedef):

boost::function<int (A*, myType1_t*, myType2_t*, myType3*> myCallbackFunction
Run Code Online (Sandbox Code Playgroud)

然后在A(ctor)的某处调用boost :: bind在该类型上,并将其传递给C库调用.

这可能吗,还是我不在基地?非常感谢.

Ben*_*aub 5

编号类型的Functor类型boost::function不会转换为函数指针以与C回调机制一起使用.

但是,大多数C回调机制都有某种令牌机制,因此您的回调函数(它是静态的)具有某种上下文信息.您可以使用它来编写一个包装类,将这些标记映射到仿函数对象,并将执行传递到右侧:

class CallbackManager {
public:
    typedef boost::function<int (type1*, type2*, type3*)> callback;

    static void setCallback(CallbackManager::callback cb)
    {
        void *token = ::setCallback(staticCallback);
        callbacks[token] = callback_I;
    }

    static void staticCallback(void* token, type1* a, type2* b, type3* c)
    { return mcallbacks[token](a, b, c); }

private:
    static std::map<void*, callback > callbacks;
};
Run Code Online (Sandbox Code Playgroud)