gpt4 book ai didi

c++ - 在类方法内的lambda函数内调用类方法

转载 作者:行者123 更新时间:2023-11-30 02:26:34 26 4
gpt4 key购买 nike

我的类方法声明如下:

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);
});

我收到以下错误:

error: no matching function for call to 'BluePlotterClient::sendCommandToBluetoothModule(const char [5], BluePlotterClient::setupBluetoothModule()::)'

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

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

最佳答案

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

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

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

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

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

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

该类可以包含任何可复制的类函数对象。

关于c++ - 在类方法内的lambda函数内调用类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42686295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com