¿Cómo uso las funciones lambda en Arduino?

Sep 25 2020

Quiero pasar una función lambda como argumento a un método. Ejemplo:

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

Si trato de compilar este código para Arduino, obtengo un error obvio:

error: 'función' en el espacio de nombres 'std' no nombra un tipo de plantilla

¿Cómo puedo usar una función lambda en Arduino?

Respuestas

2 EdgarBonet Sep 25 2020 at 01:30

std::functionno es compatible con el entorno Arduino . ( Editar : como lo menciona KIIV en un comentario, es compatible con objetivos ARM, pero no con AVR). Sin embargo, puede pasar una lambda que no captura a una función que espera un puntero de función simple. Por ejemplo, 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;
}

Puedes llamarlo como

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

Si quieres que tu lambda capture algo, parece que no tienes suerte...