std ::绑定一个常规函数,但结尾

时间:2017-04-06 01:46:02

标签: c++ lambda callback std

我有一个特定的回调(在某些'C'域中定义),需要填充一些不属于回调函数的额外工作。它是这样的......

typedef void (*callback_func)(int);
extern int set_callback(callback_func cb);

在我的C ++代码中,我需要set_value一个在我的类中在回调范围之外定义的promise。所以,我必须捕获std :: promise成员变量或者 this 并发送回调,然后在调用回调后设置它,只是编译器不喜欢它。我是这样做的,

set_callback([this](int x) {
   // some code ...
     prom.set_value(true);
});

以下是剪切错误:

error: no matching function for call to 'set_callback'
        set_callback([this](int var) {
        ^~~~~~~~~~~~~~~~~~~~~~~~~
note: candidate function not viable: no known conversion from '(lambda at xxx ' to 'callback_func'
          (aka 'void (*)(int)') for 1st argument

我意识到,我需要以某种方式“绑定”常规函数以使回调函数成为std :: function,但我不确定如何实现它 - 更不用说发送它一个参数并执行结尾。请建议,谢谢!

1 个答案:

答案 0 :(得分:0)

如果捕获列表为空,Lambdas只能衰减到函数指针。这是因为代码

[this](int x) {
   // some code ...
     prom.set_value(true);
}

大致相当于

struct SomeLambdaName {
    MyCapture self;

    auto operator()(int x) const {
        // some code ...
        self.prom.set_value(true);
    }
};

另一方面,函数指针就是:指针。指向要调用的函数地址的指针。

在C ++中,成员函数:

struct MyClass {
    int i;
    int add_x(int x) { return i = i + x; }
};

大致就像这个C代码(依赖于实现):

int add_x(MyClass *self, int x) { return self->i = self->i + x; }

如果可以更改C代码以使用void *来保存任意数据,则可以这样做:

typedef void (*callback_func)(int, void * data);
extern int set_callback(callback_func cb);
set_callback([](int x, void * data) {
     MyClass &self = *reinterpret_cast<MyClass *>(data);
     // some code ...
     self.prom.set_value(true);
});

否则,您必须拥有静态对象或类似的东西。