Como faço para usar funções lambda no Arduino?

Sep 25 2020

Eu quero passar uma função lambda como um argumento para um método. Exemplo:

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

Se tento compilar este código para Arduino, obtenho um erro óbvio:

erro: 'função' no namespace 'std' não nomeia um tipo de modelo

Como posso usar uma função lambda no Arduino?

Respostas

2 EdgarBonet Sep 25 2020 at 01:30

std::functionnão é compatível com o ambiente Arduino . ( Editar : conforme mencionado por KIIV em um comentário, é compatível com alvos ARM, mas não em AVR.) Você pode, no entanto, passar um lambda de não captura para uma função que espera um ponteiro de função simples. Por exemplo, dado

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

Você pode chamá-lo de

int sum = test.reduce(42, [](int acc, int value){ return acc + value; });

Se você quiser que seu lambda capture algo, parece que você está sem sorte ...