C++ 使用boost::bind和boost::function将成员函数类作为回调
我正在为正在使用的C库设置一个成员函数作为回调函数。C库设置回调如下:C++ 使用boost::bind和boost::function将成员函数类作为回调,c++,boost,boost-bind,boost-function,C++,Boost,Boost Bind,Boost Function,我正在为正在使用的C库设置一个成员函数作为回调函数。C库设置回调如下: typedef int (*functionPointer_t)(myType1_t*, myType2_t*, myType3_t*); setCallback(param1, param2, functionPointer, param4) 我想使用boost::bind(如果可能的话)来传递函数指针。我更希望指向的函数是实例化类的成员,而不是静态成员。例如 Class A { public: A(); p
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完成吗?根据(第三个答案),似乎我可以声明以下内容(在某处,或作为typedef):
boost::函数myCallbackFunction
然后在(ctor)调用中的某个地方对该类型进行boost::bind,并将其传递到C库调用中
这是可能的,还是我跑垒了?多谢 成员函数的问题在于,它们会自动接收指向对象实例的指针作为第一个参数-“this”指针。这就是为什么不能使用成员函数和C回调函数。要使用成员函数,必须将对象和函数指针放在一起。否。类似于
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;
};
类回调管理器{
公众:
typedef boost::函数回调;
静态void setCallback(CallbackManager::callback cb)
{
void*token=::setCallback(staticCallback);
回调[令牌]=回调I;
}
静态void staticCallback(void*令牌,类型1*a,类型2*b,类型3*c)
{返回mcallbacks[token](a,b,c);}
私人:
静态std::map回调;
};
不要使用map,它会增加运行时开销,并使代码与静态map混淆
改为使用重新解释\u 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.
}
};
//clib.h
typedef void(*CALLBACK_FUNC)(整数代码,void*param);
void set_callback(callback_FUNC,void*param);
//a.h
甲级{
公众:
()
{
::set_回调(&A::static_回调,this);
}
私人:
静态void静态_回调(int代码,void*param)
{
A*self=重新解释铸件(参数);
自->回调(代码);
}
内联无效回调(int代码)
{
//在这里编写代码。
}
};
这毫无意义。如果这是真的,我就不能根据实际情况将boost::函数降级为原始指针,但这很复杂。这:A;a、 call()
相当于:A;A::调用(&A)代码>按照C++规范,我相信。问题是,原始函数指针不能带着这个指针。谢谢!这解释了很多。我不能改变setCallback@jdt141的接口:你能不能在setCallback
中滥用param1、param2、param4
中的一个,偷偷地插入一个令牌,该令牌将通过int(*functionPointer\t)(myType1\u t*、myType2\u t*、myType3\u t*)返回给你
?埃米尔-完全没有听到你的评论。我相信我能做到,但到目前为止,上述方法对我很有效
// 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.
}
};