Функция CPP param использование функции с несколькими параметрами
Я хочу указать функцию с параметрами для параметра функции, но это не сочетается.
////////////////////////////////////////////////////////////////////////
// Пример фунча...
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);
@CloverField, 👍0
Обсуждение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
- Невозможно преобразовать 'int (*)[size]' в 'int**': Cannot convert 'int (*)[size]' to 'int**'
- Ошибка 'Serial' was not declared in this scope
- Как удалить элемент из массива arduino?
- Как передать несколько переменных в функцию?
- Есть ли функция Adafruit для инвертирования цветов моего экрана для языка Arduino?
- Как вернуть значение массива символов в функции Arduino IDE?
- Проблема с функцией, имеющей параметр со значением по умолчанию
- Ошибка: Переменная или поле объявлены недействительными
То, как вы этого хотите, - это не то, как работает 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