1Fermer3
ZephLe 20/12/2015 à 18:13
Oui c'est très pratique pour injecter des petits bouts de code dans une fonction. De cette façon tu peux combiner des comportements et réutiliser ton code plus efficacement qu'avec par exemple de l'héritage. Un petit exemple cas d'école : mettons que tu codes la fonction de tri la plus rapide de l'univers. Tu aimerais bien qu'elle soit capable de trier une liste de n'importe quel type, encore faut-il définir comment on compare deux objets de ce type entre eux pour savoir lequel est le plus grand. Ça ne fait pas tellement partie de l'algorithme de tri, et de toutes façons tu ne peux pas connaître à l'avance tous les objets qu'on aura envie de trier avec ta fonction.

Une solution consiste à laisser l'utilisateur de ta fonction passer en paramètre, en plus de la liste à trier, une fonction de comparaison qui permet de déterminer entre deux objets lequel est le plus grand. Lors de l'utilisation de ta fonction de tri, passer cette fonction de comparaison via une lambda sera facile et lisible.

Voilà la signature de ta fonction de tri qui trie des objets de type "T". Elle prend un vecteur d'instances de "T" (items) et une fonction qui prend deux objets "T" et me retourne -1 si le premier est plus petit, 0 s'ils sont égaux ou 1 si le deuxième est plus petit :template<typename T> maSuperFunctionDeTri(vector<T>* items, function<int (const T&, const T&)> compare);
Ensuite je veux trier un vecteur de comptes utilisateur de yAronet en fonction de leur login. Rien de plus simple, je passe une fonction "compare" qui se base sur le login pour déterminer l'ordre entre deux utilisateurs (en délégant la comparaison à la fonction "compare" du type std::string qui fait exactement ce que je veux) :maSuperFunctionDeTri(&accounts, [] (const Account& yaronaute1, const Account& yaronaute2) { return yaronaute1.login.compare(yaronaute2.login); });
Maintenant si je veux comparer en fonction de leur nombre de posts plutôt que le login, je n'ai qu'à changer la lambda :maSuperFunctionDeTri(&accounts, [] (const Account& yaronaute1, const Account& yaronaute2) { if (yaronaute1.posts < yaronaute2.posts) return -1; else if (yaronaute1.posts > yaronaute2.posts) return 1; else return 0; });