7

我正在设置一个成员函数作为我正在使用的 C 库的回调。C 库像这样设置回调:

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

setCallback(param1, param2, functionPointer, param4)

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

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

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

boost::function<int (A*, myType1_t*, myType2_t*, myType3*> myCallbackFunction

然后在 A(ctor)中的某个地方调用该类型的 boost::bind,并将其传递给 C-library 调用。

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

4

3 回答 3

5

不。函子类型,如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;
};
于 2010-01-04T19:56:42.760 回答
1

不要使用地图,它会产生运行时开销并使用静态地图使代码混乱。

改为使用reinterpret_cast

例如

// clib.h
typedef void (*CALLBACK_FUNC)(int code,void *param);

void set_callback( CALLBACK_FUNC, void * param ); 

// a.h

class A {
public:
    A()
    {
        ::set_callback( &A::static_callback, this);
    }
private:
    static void static_callback(int code, void * param)
    { 
        A* self = reinterpret_cast<A*>(param);
        self->callback( code );
    }

    inline void callback( int code )
    {
        // write you code here.
    }
};
于 2011-02-04T11:50:39.140 回答
0

成员函数的问题在于它们会自动接收指向对象实例的指针作为第一个参数——“this”指针。这就是为什么不能使用成员函数和 C 回调函数的原因。您必须将对象和函数指针放在一起才能使用成员函数。

于 2010-01-04T19:54:31.080 回答