我正在使用 vscode 以及 ESPAsyncWebServer 和 Wifi 庫在 ESP32 上進行開發。我正在嘗試制作自己的 wifi 管理器,所以我想在一個類中添加一些函式,但是我在指向成員函式時遇到了一些麻煩。
我有這個沒有類的定義:
void onNotFound(AsyncWebServerRequest *request){
//Handle Unknown Request
request->send(404);
}
String processor(const String& var)
{
if(var == "HELLO_FROM_TEMPLATE")
return F("Hello world!");
return String;
}
我想從班上給他們打電話,女巫是:
我的_Wifi.h
class My_Wifi {
private:
Config *config;
DNSServer dnsServer;
AsyncWebServer server;
uint16_t serverPort = 80;
void onNotFound(AsyncWebServerRequest *request); <------
String processor(const String& var); <-----
void webServerSetup();
public:
My_Wifi();
void setup(uint16_t port);
void sendJsonDoneResponse(AsyncWebServerRequest *request);
};
我的_Wifi.cpp
void My_Wifi::onNotFound(AsyncWebServerRequest *request) {...}
String My_Wifi::processor(const String& var) {...}
void My_Wifi::webServerSetup() {
this->dnsServer.start(53, "*", WiFi.softAPIP());
this->server.onNotFound(this->onNotFound); <------
this->server
.serveStatic("/wifi_settings.html", SPIFFS, "/wifi_settings.html")
.setTemplateProcessor(this->processor) <------
.setFilter(ON_STA_FILTER);
...
}
顯然這只是呼叫函式而不是參考它。
如何通過指標呼叫成員函式?
謝謝你的時間。
我試過了:
typedef void (My_Wifi::*onNotFoundFn)(AsyncWebServerRequest *request);
void My_Wifi::webServerSetup() {
this->dnsServer.start(53, "*", WiFi.softAPIP());
onNotFoundFn ptr = &My_Wifi::onNotFound;
this->server.onNotFound(*ptr); //this->server.onNotFound(ptr);
...
}
uj5u.com熱心網友回復:
為了呼叫成員函式,您需要提供應該呼叫成員函式并且它應該匹配的物件
typedef std::function<String(const String&)> AwsTemplateProcessor;
使用 lambda 的示例,捕獲this:
.setTemplateProcessor([this](const String& str) { return processor(str); } )
onNotFound應該匹配的類似 lambda
typedef std::function<void(AsyncWebServerRequest *request)> ArRequestHandlerFunction;
看起來像這樣:
server.onNotFound([this](AsyncWebServerRequest* r) { onNotFound(r); });
由于您實際上并未this在onNotFound回呼中使用,因此您可以創建當前的回呼函式static:
class My_Wifi {
private:
static void onNotFound(AsyncWebServerRequest *request);
并在沒有 lambda 的情況下提供:
server.onNotFound(&My_Wifi::onNotFound);
或者,根本不創建成員函式。只需提供一個 lambda:
server.onNotFound([](AsyncWebServerRequest* request){ request->send(404); });
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435290.html
