lundi 28 juillet 2014

De l'usage des lambdas

Enfin lancé à pleine vapeur sur une base de code sous g++4.8 (j'en parlais ici), je peux utiliser à fond les toutes dernières fonctionnalités du standard. En particulier, j'utilise beaucoup le range-based for, et le mot-clé override. Et, bien sûr, les lambdas.

Le cas des lambdas est intéressant. J'en rêvais pour les mettre dans mes std::for_each, lesquels avaient l'avantage d'être très brefs, en comparaison des déclarations d'itérateurs à ralonge. Les variables auto ont rendu les itérateurs bien plus agréables à utiliser, et le range-based for a fini de combler l'écart. Pour une boucle simple, un std::for_each avec un lambda est plutôt moins pratique qu'un for, en particulier, il faut rentrer begin, end, et le type du paramètre dans la lambda (en attendant les lambdas polymorphiques), à comparer à un for(auto && element : container){...}.

Reste les autres cas, en particulier les tris. Notre bon vieux std::sort veut un comparateur, et lui donner une lambda est rudement pratique. Il y a également std::binary_search dans la même veine.

C'est là que je trouve que déclarer sa lambda en dehors de l'algorithme a beaucoup d'avantages. D'une part, c'est réutilisable, s'il faut trier plusieurs conteneurs avec le même comparateur. Et d'autre part, c'est beaucoup plus lisible.

auto comparator = [](const Element & left, const Element & right)
  {return left._name < right._name;};
[...]
std::sort(c.begin(), c.end(), comparator);

Au final, cela permet de voir sa lambda plus comme un foncteur local avec une syntaxe très condensée (ce qu'était déjà le std::bind, au final, même si l'absence d'auto à l'époque rendait sa déclaration absolument épouvantable lorsque ce n'était pas un temporaire).

C'est quand même beaucoup plus joli comme cela, non?

Aucun commentaire: