通过指针调用成员函数

Calling member function by pointer

我正在使用 vscode 以及 ESPAsyncWebServer 和 Wifi 库在 ESP32 上进行开发。 我正在尝试制作自己的 wifi 管理器,所以我想将一些函数放在 class 中,但我很难指向成员函数。

我有这个定义没有 class:

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

我想给他们打电话 class 是:

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

};

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

为了调用成员函数,您需要提供应该调用成员函数的对象,它应该匹配

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

由于您实际上并未在 onNotFound 回调中使用 this,因此您 可以 使当前的回调函数 static:

class My_Wifi {
    private:
        static void onNotFound(AsyncWebServerRequest *request);

并在没有 lambda 的情况下提供:

server.onNotFound(&My_Wifi::onNotFound);

或者,根本不创建成员函数。只需提供一个 lambda:

server.onNotFound([](AsyncWebServerRequest* request){ request->send(404); });