Функция CPP param использование функции с несколькими параметрами

functions cpp

Я хочу указать функцию с параметрами для параметра функции, но это не сочетается.

////////////////////////////////////////////////////////////////////////

// Пример фунча...
void fileLoad(String path, String type) {
  file = SD.open(path.c_str(), FILE_READ);
  server.streamFile(file, type) != file.size();
  file.close();
}

// Вот как я хочу его использовать, но это невозможно:
server.on("/homepage", fileLoad("app/homepage.html", "text/html") );

////////////////////////////////////////////////////////////////////////

// В настоящее время, как это работает, вам нужен 1 дополнительный фунч...:
void homepage() {
  fileLoad("app/homepage.html", "text/html");
}
server.on("/homepage", homepage);

, 👍0

Обсуждение

То, как вы этого хотите, - это не то, как работает C++. В зависимости от того, как написано "on" и что вы на самом деле используете, вы можете использовать лямбду или начать играть в игры на C++ а-ля https://stackoverflow.com/a/41528436/438992. Но я бы этого не сделал., @Dave Newton

@DaveNewton, это [делает support](https://github.com/esp8266/Arduino/blob/2.7.4/libraries/ESP8266WebServer/src/ESP8266WebServer.h#L94) std::function и так далее лямбды того типа, который был бы необходим, так что вы могли бы сделать это ответом., @timemage

@timemage Я не помню достаточно C++, чтобы быть последовательным ;), @Dave Newton

Ну, мне нужно еще кофе, но я все равно попробовал. =), @timemage


1 ответ


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

1

Вы можете найти примеры такого рода вещей в примерах библиотеки.

Функция on() поддерживает std::function в качестве параметра, что, в свою очередь, означает, что вы можете использовать лямбда-выражение C++11-onwards(которое Дэйв Ньютон упомянул в комментариях) для прокси-вызова функции с двумя аргументами через функцию без аргументов:

server.on("/homepage", [] () {
    fileLoad("app/homepage.html", "text/html");
});

[] ("список захвата") - это то, что будет использоваться, если вы хотите скопировать или сослаться на вещи в рамках вызова функции on. Поскольку вы этого не делаете, вы также можете просто написать функцию без аргументов, которая поворачивается и вызывает fileLoad с вашими двумя известными значениями во время компиляции. Но людям, использующим эту библиотеку веб-сервера, часто приходится ссылаться на вещи в области видимости.


Как примечание, я бы не стал использовать String в качестве полученного типа параметра в void fileLoad(String path, String type). При передаче строкового литерала вы просто вызываете динамическое распределение без особой причины.

,

Спасибо!!! :), @CloverField