我的类方法声明如下:
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);
});
答案 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
}
该类可以保存任何可复制的函数类对象。