Une partie du problème prédate largement le C++11 : Il s'agit de std::pair. D'un certain point de vue, ce n'est rien d'autre qu'une classe à deux membres pour laquelle on a été trop fainéant pour trouver un nom
(bon, ok, avec tuple, C++11 pousse ça dans une nouvelle dimension).
Et pour moi, utiliser std::pair pour remplacer une vraie classe, avec ses invariants, son utilisation dans plusieurs contextes... a toujours été une hérésie (j'aurais d'ailleurs bien aimé une map dont je puisse décider du value_type et du membre qui constitue la clef).
Maintenant, il faut avouer que quand la pair n'est utilisée qu'à un seul endroit, ou quand on fait une bibliothèque assez bas niveau pour laquelle on ne sait pas associer de sens métier à first et second, et bien std::pair est assez adapté.
Je pense que c'est pareil pour le find. D'ailleurs, pour moi, ici, le problème n'est pas que le lambda et le fait qu'il n'est pas nommé, mais juste que l'on a un find spécialisé non nommé, le problème serait identique si on avait non pas :
auto it = std::find_if(begin(m_triangles), end(m_triangles), [pos](const std::pair<sf::Vector2f, sf::ConvexShape> &p){return p.first == pos;}
mais
auto it = std::find_if(begin(m_triangles), end(m_triangles), IsAtSamePos(pos));
Qui reste bien moins clair que ton findCorrespondingTriangle (même si je n'aime pas la manière dont tu l'as déclaré, mais c'est un autre sujet, c'est son existence qui compte).
Si on doit rechercher ainsi une seule fois un triangle, dans le cadre d'une algorithme plus évolué, j'aime bien la version avec lambda non encapsulée. S'il s'agit d'un service à rendre en tant que tel, de manière répétée, et bien, je ferais soit une fonction libre, soit carrément une classe gérant un ensemble de triangles, avec ses propres invariants, etc. Et dans les deux cas, j'aurais un test unitaire de cette fonction.
Partager