Как использовать лямбда-функции в Arduino?

c++ stl lambda

Я хочу передать лямбда-функцию в качестве аргумента метода. Пример:

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 ответ


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

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

Если вы хотите, чтобы лямбда-выражение что-то зафиксировало, похоже, вы удачи...

,

Не совсем верно. Не поддерживается компилятором avr-g++. Однако компиляторы для Arduino на базе ARM обычно имеют полную поддержку библиотек STL, включая std::function., @KIIV

@KIIV: спасибо за внимание. Я отредактировал ответ., @Edgar Bonet

Вы можете эмулировать замыкание экземпляром вспомогательного класса, который хранит захваченные значения и реализует функцию. Я не пробовал, но ожидаю, что это сработает даже для AVR., @the busybee