在 class 中将函数作为参数传递
Passing a function as a parameter within a class
所以我正在尝试为一个项目争取使用 ESPAsyncWebServer,并且由于所述项目的大小,我正在将我的代码重构到一堆不同的库中。这是客户端服务器处理部分的一部分。
我已经确定了如何有效地将 *request 传递给单独的函数以清理我的代码。 IE。
在我的库 .cpp 文件中
server->on("/heap", HTTP_GET, [this](AsyncWebServerRequest *request) { handleHeap(request); });
触发:
void CServer::handleHeap(AsyncWebServerRequest *request) { request->send(200, "text/plain", String(ESP.getFreeHeap())); }
我 运行 遇到的一个问题是试图将我的 "Processor" 函数传递给模板响应。
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);
}
error: no matching function for call to
'AsyncWebServerRequest::send(fs::FS&, const char [9], String, )
尝试在 Lambda 中传递 processor() 也无法编译,因为没有参数进入。
error: no matching function for call
to 'CServer::processor()
' request->send(SPIFFS, "/gps.htm", String(), [this] { processor(); });
^ lib\CServer\CServer.cpp:128:66: note:
candidate is: lib\CServer\CServer.cpp:108:8: note: String
CServer::processor(const String&)
sooo,如何按照指南 here 中的说明将所需的处理器函数传递到我的响应参数中?
供参考:
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);
如果都在 main.cpp 就好了,但这不是我想做的!
制作你的方法static
,或者调用应该是:
void CServer::handleGPS(AsyncWebServerRequest *request)
{
request->send(SPIFFS, "/gps.htm", String(), [this](const String& var) { return processor(var); });
}
由于您的处理器函数是一个 class 方法,您需要将其与隐式 this
参数绑定。
我们可以找到回调类型定义:typedef std::function<String(const String&)> AwsTemplateProcessor;
request->send(SPIFFS, "/index.htm", String(), false, [this](const String &var) -> String { return this->processor(var); });
这里的 lambda 以 const String &var
作为参数,例如 AwsTemplateProcessor
,我们通过编写 [=16] 来精确 AwsTemplateProcessor
函数的 return 类型=] 在 lambda 原型之后。通过精确地确定参数 和 和 return 类型,发送方法可以将 lambda 与 std::function
(AwsTemplateProcessor
).
相关联
所以我正在尝试为一个项目争取使用 ESPAsyncWebServer,并且由于所述项目的大小,我正在将我的代码重构到一堆不同的库中。这是客户端服务器处理部分的一部分。
我已经确定了如何有效地将 *request 传递给单独的函数以清理我的代码。 IE。 在我的库 .cpp 文件中
server->on("/heap", HTTP_GET, [this](AsyncWebServerRequest *request) { handleHeap(request); });
触发:
void CServer::handleHeap(AsyncWebServerRequest *request) { request->send(200, "text/plain", String(ESP.getFreeHeap())); }
我 运行 遇到的一个问题是试图将我的 "Processor" 函数传递给模板响应。
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);
}
error: no matching function for call to 'AsyncWebServerRequest::send(fs::FS&, const char [9], String, )
尝试在 Lambda 中传递 processor() 也无法编译,因为没有参数进入。
error: no matching function for call to '
CServer::processor()
'request->send(SPIFFS, "/gps.htm", String(), [this] { processor(); });
^ lib\CServer\CServer.cpp:128:66: note:
candidate is: lib\CServer\CServer.cpp:108:8: note: String
CServer::processor(const String&)
sooo,如何按照指南 here 中的说明将所需的处理器函数传递到我的响应参数中?
供参考:
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);
如果都在 main.cpp 就好了,但这不是我想做的!
制作你的方法static
,或者调用应该是:
void CServer::handleGPS(AsyncWebServerRequest *request)
{
request->send(SPIFFS, "/gps.htm", String(), [this](const String& var) { return processor(var); });
}
由于您的处理器函数是一个 class 方法,您需要将其与隐式 this
参数绑定。
我们可以找到回调类型定义:typedef std::function<String(const String&)> AwsTemplateProcessor;
request->send(SPIFFS, "/index.htm", String(), false, [this](const String &var) -> String { return this->processor(var); });
这里的 lambda 以 const String &var
作为参数,例如 AwsTemplateProcessor
,我们通过编写 [=16] 来精确 AwsTemplateProcessor
函数的 return 类型=] 在 lambda 原型之后。通过精确地确定参数 和 和 return 类型,发送方法可以将 lambda 与 std::function
(AwsTemplateProcessor
).