在类方法中调用lambda函数内的类方法

时间:2017-03-09 03:47:38

标签: c++ c++11 lambda

我的类方法声明如下:

void sendCommandToBluetoothModule(String command, SendCommandToBluetoothModuleCallback callback);

SendCommandToBluetoothModuleCallback的位置:

typedef void (*SendCommandToBluetoothModuleCallback)(String);

所以,我正在打这个电话:

sendCommandToBluetoothModule("AT\r\n", [](String response) -> void {
  Serial.println(response);
});

一切都按预期工作。问题是:如果我尝试调用另一个类成员函数,那么我应该捕获this。我将最后一段代码更改为:

的那一刻
sendCommandToBluetoothModule("AT\r\n", [this](String response) -> void {
  Serial.println(response);
});

我收到以下错误:

  

错误:没有匹配的调用函数   'BluePlotterClient :: sendCommandToBluetoothModule(const char [5],   BluePlotterClient :: setupBluetoothModule()::)'

为了能够进行此调用,我需要做些什么(例如):

sendCommandToBluetoothModule("AT\r\n", [this](String response) -> void {
  this->classMemberFunction(response);
});

1 个答案:

答案 0 :(得分:3)

您不能将带有捕获的lambda用作函数指针。捕获时,在lambda中添加一个不能包含在简单函数指针中的附加状态。

要解决这个问题,你可以像stl一样使用模板:

template<typename F>
void sendCommandToBluetoothModule(String, F callback) {
    // things
}

回调的类型F可以是函数指针或lambda,也可以是任何类似函数的对象。

如果需要类型擦除,例如将回调存储在向量中或将其分配给固定类型的数据成员,则可以使用std::function。请注意,此解决方案会牺牲性能,因为它不像模板那样可以优化:

void sendCommandToBluetoothModule(String, std::function<void(String)> callback) {
    // things
}

该类可以保存任何可复制的函数类对象。