Передача функции-члена класса в качестве аргумента

Мне нужно передать функцию-член класса в server.on, к сожалению, я получаю ошибку.

ошибка: нет соответствующей функции для вызова 'ESP8266WebServer::on

Я немного поискал, но не смог понять ничего, что нашел. Нет простого объяснения.

Это работает:

void handleRoot(){}
server.on("/", handleRoot);

Это не так:

void myClass::handleRoot(){}
void myClass::setup(){
    server.on("/", handleRoot);
}

Вторым аргументом server.on является

typedef std::function<void(void)> THandlerFunction;

К сожалению, я понятия не имею, что это значит.

, 👍5

Обсуждение

Похоже, это скорее вопрос C++, чем вопрос Arduino., @TheDoctor

@TheDoctor, вы, вероятно, правы, но я подумал, что, поскольку это связано с IDE Arduino, у кого-то может возникнуть такая же проблема., @Molda

На самом деле это не имеет ничего общего с IDE как таковой., @Ignacio Vazquez-Abrams

@Игнасио Васкес-Абрамс, поскольку я использую Arduino IDE для написания кода и загрузки его в свой esp8266, как это делают многие другие, это во многом связано с этим. Другие люди используют ту же библиотеку и поэтому могут столкнуться с той же проблемой. Кроме того, я очень ценю ваш полезный комментарий., @Molda

Это произойдет с любым редактором, инструментом загрузки или библиотекой. Это языковая проблема., @Ignacio Vazquez-Abrams


3 ответа


Лучший ответ:

3

Это довольно распространенный вопрос, связанный с программированием на C++.

Подробное объяснение можно найти здесь.

Краткий ответ: это сильно отличается от получения адреса обычной функции.

Обходные пути (которые могут работать, а могут и не работать, в зависимости от того, для чего еще вам нужна эта функция):

  • сделать его статичным
  • объявите ее как дружественную функцию, а не как функцию-член

В любом случае, дело в том, что это должно быть не что-то связанное с экземпляром класса, а скорее с классом в целом.

,

Статические работы. Надеюсь, я не столкнусь с еще одной проблемой, сделав ее статичной :) Большое спасибо., @Molda


4

Я столкнулся с той же проблемой.
Дальнейшие исследования синтаксиса C++ помогли мне найти это чистое решение, основанное на

Синтаксис std::bind:

server.on("/", std::bind(&myClass::handleRoot, this));
,

Если у вас установлена стандартная библиотека шаблонов, да., @Nick Gammon


4

Это выполнит свою работу — используя синтаксис анонимной функции:

server->on("/", [&]() {
   handleRoot();
});
,