Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在类中作为参数传递函数_C++_Arduino_Refactoring_Esp8266 - Fatal编程技术网

C++ 在类中作为参数传递函数

C++ 在类中作为参数传递函数,c++,arduino,refactoring,esp8266,C++,Arduino,Refactoring,Esp8266,因此,我试图在一个项目中使用,由于该项目的规模,我正在将我的代码重构为一系列不同的库。这是客户机-服务器处理部分的一部分 为了清理代码,我已经决定如何有效地将*请求传递给不同的函数。即。 在my Libraries.cpp文件中 server->on("/heap", HTTP_GET, [this](AsyncWebServerRequest *request) { handleHeap(request); }); 哪些火灾: void CServer::handleHeap(Asyn

因此,我试图在一个项目中使用,由于该项目的规模,我正在将我的代码重构为一系列不同的库。这是客户机-服务器处理部分的一部分

为了清理代码,我已经决定如何有效地将*请求传递给不同的函数。即。 在my Libraries.cpp文件中

server->on("/heap", HTTP_GET, [this](AsyncWebServerRequest *request) { handleHeap(request); });
哪些火灾:

void CServer::handleHeap(AsyncWebServerRequest *request) { request->send(200, "text/plain", String(ESP.getFreeHeap())); }
我遇到的问题是试图将“处理器”函数传递给模板化响应

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);
}
错误:没有用于调用的匹配函数 'AsyncWebServerRequest::send(fs::fs&,常量字符[9],字符串,)

尝试在Lambda中传递processor()也不会编译,因为没有参数进入

错误:没有用于调用的匹配函数 到“
CServer::processor()
请求->发送(SPIFFS,“/gps.htm”,String(),[this]{processor();})
^lib\CServer\CServer.cpp:128:66:注意:
候选项是:lib\CServer\CServer.cpp:108:8:注意:String
CServer::processor(常量字符串&)

那么,我如何处理将所需的处理器函数传递到指南中所述的响应参数中

供参考:

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中,那很好,但这不是我想要做的

使您的方法成为静态的,或者调用应该是:

void CServer::handleGPS(AsyncWebServerRequest *request)
{
    request->send(SPIFFS, "/gps.htm", String(), [this](const String& var) { return processor(var); });
}

由于处理器函数是类方法,因此需要将其与隐式
this
参数绑定

我们可以找到回调typedef:
typedef std::函数AwsTemplateProcessor

request->send(SPIFFS, "/index.htm", String(), false, [this](const String &var) -> String { return this->processor(var); });

这里的lambda将
const String&var
作为参数,例如
AwsTemplateProcessor
,我们通过在lambda原型之后写入
->String
来精确
AwsTemplateProcessor
函数的返回类型。通过正确计算参数和返回类型,send方法可以将lambda与
std::function
AwsTemplateProcessor
)关联起来。

我假设它在
main
中运行良好,因为它是一个本地函数,而
处理器
函数是一个成员函数。我不确定,但是你能把参数包装成一个lambda吗?大概你可以在lambda中添加一个字符串参数,并将其传递给process?使用第一个方法,我得到了编译错误:“占位符”不是名称空间名称。lambda有效!看起来“->String”部分起了很大的作用。你能解释一下lambda的这部分在做什么吗?如果您将其与下面发布的@Jarod42(AWS函数不匹配)进行比较,这似乎是唯一的区别。在编译时,我得到以下警告:lib\CServer\CServer.cpp:128:108:警告:函数中没有返回语句返回非void[-Wreturn type]请求->发送(SPIFFS,/gps.htm),String(),false,[this](const-String&var)->String{processor(var);});模板处理器不起作用,所以我想知道返回值是否在某个地方丢失了?您需要返回处理器才能返回lambda中的
String
[this](const-String&var)->String{return processor(var);}
这就是问题所在,有道理。现在运行正常。谢谢!