我有一个特定的回调(在某些'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,但我不确定如何实现它 - 更不用说发送它一个参数并执行结尾。请建议,谢谢!
答案 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);
});
否则,您必须拥有静态对象或类似的东西。