Comment utiliser les fonctions lambda dans Arduino?

Sep 25 2020

Je veux passer une fonction lambda comme argument à une méthode. Exemple:

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 j'essaye de compiler ce code pour Arduino, j'obtiens une erreur évidente:

erreur: 'function' dans l'espace de noms 'std' ne nomme pas de type de modèle

Comment puis-je utiliser une fonction lambda dans Arduino?

Réponses

2 EdgarBonet Sep 25 2020 at 01:30

std::functionn'est pas pris en charge par l'environnement Arduino . ( Edit : comme mentionné par KIIV dans un commentaire, il est pris en charge sur les cibles ARM, mais pas sur AVR.) Vous pouvez, cependant, passer un lambda non capturant à une fonction qui attend un pointeur de fonction simple. Par exemple, étant donné

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

Vous pouvez l'appeler comme

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

Si vous voulez que votre lambda capture quelque chose, il semblerait que vous n'ayez pas de chance ...