Roc*_*399 2 c++ refactoring arduino esp8266
所以我正在尝试为一个项目争取使用ESPAsyncWebServer,并且由于所述项目的大小,我将我的代码重构为一堆不同的库。这是客户端服务器处理部分的一部分。
我已经确定如何有效地将 *request 传递给单独的函数,以便清理我的代码。IE 在我的库中的 .cpp 文件
server->on("/heap", HTTP_GET, [this](AsyncWebServerRequest *request) { handleHeap(request); });
Run Code Online (Sandbox Code Playgroud)
哪个火:
void CServer::handleHeap(AsyncWebServerRequest *request) { request->send(200, "text/plain", String(ESP.getFreeHeap())); }
Run Code Online (Sandbox Code Playgroud)
我遇到问题的地方是试图将我的“处理器”函数传递给模板响应。
String CServer::processor(const String &var)
{
if (var == "locationLat")
return String(gps.location.lat());
return String();
}
void CServer::handleGPS(AsyncWebServerRequest *request)
{
request->send(SPIFFS, "/gps.htm", String(), processor);
}
Run Code Online (Sandbox Code Playgroud)
错误:没有匹配的函数调用 'AsyncWebServerRequest::send(fs::FS&, const char [9], String, )
尝试在 Lambda 中传递 processor() 也不会编译,因为没有传入参数。
错误:没有匹配的函数调用 '
CServer::processor()
'request->send(SPIFFS, "/gps.htm", String(), [this] { processor(); });
^ lib\CServer\CServer.cpp:128:66:注意:
候选是:lib\CServer\CServer.cpp:108:8:注意:字符串
CServer::processor(const String&)
sooo,我如何按照此处的指南中的说明处理将所需的处理器函数传递到我的响应参数中?
以供参考:
String processor(const String& var)
{
if(var == "HELLO_FROM_TEMPLATE")
return F("Hello world!");
return String();
}
// ...
//Send index.htm with template processor function
request->send(SPIFFS, "/index.htm", String(), false, processor);
Run Code Online (Sandbox Code Playgroud)
如果一切都在 main.cpp 中就好了,但这不是我想要做的!
由于您的处理器函数是一个类方法,您需要将它与隐式this
参数绑定。
我们可以找到回调 typedef : typedef std::function<String(const String&)> AwsTemplateProcessor;
request->send(SPIFFS, "/index.htm", String(), false, [this](const String &var) -> String { return this->processor(var); });
Run Code Online (Sandbox Code Playgroud)
这里的 lambda 以 aconst String &var
作为参数,例如AwsTemplateProcessor
,我们AwsTemplateProcessor
通过-> String
在 lambda 原型之后写来精确地确定函数的返回类型。通过正确地精确参数和返回类型,send 方法可以将 lambda 与std::function
( AwsTemplateProcessor
) 联系起来。