Как использовать лямбда-функции в Arduino?
Я хочу передать лямбда-функцию в качестве аргумента метода. Пример:
T reduce(const T initial, const std::function<T(T, T)> acc) {
T value = initial;
for (size_t i = 0; i < S; ++i) {
value = acc(value, this->values[i]);
}
return value;
}
...
int sum = this->reduce(42, [](int acc, int value) { return acc + value; });
Если я попытаюсь скомпилировать этот код для Arduino, я получу очевидную ошибку:
ошибка: "функция" в пространстве имен "std" не указывает тип шаблона
Как я могу использовать лямбда-функцию в Arduino?
1 ответ
Лучший ответ:
▲ 1
std::function
не поддерживается средой Arduino.
(ОБНОВЛЕНИЕ: как упоминалось в комментарии KIIV, поддерживается на ARM
цели, но не на AVR.) Однако вы можете передать незахватывающую лямбду
к функции, которая ожидает простой указатель функции. Например, учитывая
T reduce(const T initial, T (*acc)(T, T)) {
T value = initial;
for (size_t i = 0; i < S; ++i) {
value = acc(value, this->values[i]);
}
return value;
}
Вы можете назвать это как
int sum = test.reduce(42, [](int acc, int value){ return acc + value; });
Если вы хотите, чтобы лямбда-выражение что-то зафиксировало, похоже, вы удачи...
,
@Edgar Bonet
Смотрите также:
- Полностью ли поддерживается C++ STL на Arduino?
- Безопасно ли использовать std::array (из C++ STL) на Arduino? Использует ли он динамическое выделение памяти?
- Использование лямбд в качестве функций обратного вызова
- Как объявить динамический массив?
- Использовать обратные вызовы в ардуино с указателями на функции (будут ли функции сохраняться в памяти?)
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
Не совсем верно. Не поддерживается компилятором avr-g++. Однако компиляторы для Arduino на базе ARM обычно имеют полную поддержку библиотек STL, включая std::function., @KIIV
@KIIV: спасибо за внимание. Я отредактировал ответ., @Edgar Bonet
Вы можете эмулировать замыкание экземпляром вспомогательного класса, который хранит захваченные значения и реализует функцию. Я не пробовал, но ожидаю, что это сработает даже для AVR., @the busybee