En C++11, il y a une pratique qui s'est faite avec les ranges. On peut relever sur le blog de Herb Sutter dans sa page de présentation du C++ moderne :
Jusque là tout va bien, on nous explique que c'est générique, extensible, bref que c'est la crème.
Seulement il y a un problème. Voyez-vous, ce code n'est générique que si v est un objet dont la classe est dans le namespace std. Dès lors que vous sortez des clous, c'est la misère.
Si v n'est pas dans std:: et qu'il dispose de fonctions membres .begin() .end(), alors il sera nécessaire d'écrire :
sort(std::begin(v), std::end(v));
Si vous avez défini des begin(decltype(v)&) et end(decltype(v)&) en fonctions libres, c'est le sort qui cette fois-ci ne va pas passer, il faudra alors écrire :
std::sort(begin(v), end(v));
La seule solution qui vous permettra de garder ce code générique est de définir des std::begin(decltype(v)&) et std::end(decltype(v)&).
Je ne sais qu'en penser, mais devoir ajouter des éléments dans le namespace std, ce n'est selon moi pas une preuve d'extensibilité, ni ce qu'on a l'habitude de faire.
Que faire également si l'on souhaite spécialiser un algorithme ? Ou en ajouter un ? Doit-on également toucher au namespace std ?
Quel sera l'avenir de la réponse apportée une fois qu'on se retrouve avec un design tel que sort(v); qui semble se profiler à l'horizon puisqu'on peut déjà voir Bjarne Stroustrup l'utiliser dans ses conférences ?
Partager