Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost::bind和boost::function将成员函数类作为回调_C++_Boost_Boost Bind_Boost Function - Fatal编程技术网

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

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

我正在为正在使用的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完成吗?根据(第三个答案),似乎我可以声明以下内容(在某处,或作为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.
    }
};