Voici en gros quelques éléments, détail ou usage avancés se trouvent sur http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/ et autres années.
Les concepts :
- Vérifier à la compilation qu'un argument template a un type qui est convenable pour le template (ex : On met un type non assignable dans un vector, on a immédiatement un message d'erreur clair)
- Vérifier à la compilation que la personne n'utilise pas d'autres fonctionnalités d'un type que celle qu'il a indiqué utiliser (par exemple, qu'il n'utilise pas accidentellement un constructeur de copie quand il n'a pas indiqué que l'argument template devait être copiable)
Auto :
Déterminer le type d'une variable en fonction de celui de sa valeur d'initialisation. Exemple classique :
for (std::map<std::string, std::vector<int> >::const_iterator it = maMap.begin(); it != maMap.end() ; ++it) {...}
Deviendrait :
for (auto it = maMap.begin(); it != maMap.end() ; ++it) {...}
Les lambdas : Possibilité de définir localement une fonction anonyme. Exemple :
1 2 3 4
| vector<C> v;
void print(std::ostream &os, C const& c);
std::ostream &operator<<(std::ostream &os, C const& c);
std::for_each(v.begin(), v.end(), ....) |
Aujourd'hui, à la place des ..., on peut écrire :
- Une fonction spéciale :
1 2 3 4 5
| void printOnCout(C const &c)
{
cout << c;
}
std::for_each(v.begin(), v.end(), &printOnCout) |
- Utiliser les binders de la STL, ou mieux, ceux de boost :
std::for_each(v.begin(), v.end(), boost::bind(&print, std::cout, _1);
- Laisser tomber for_each, et écrire une boucle for explicite.
Avec les lambdas, on pourrait directement écrire un truc du genre :
std::for_each(v.begin(), v.end(), lambda (x, std::cout << x));
En gros, pour moi, tant qu'il n'y a pas de lambda, les algorithmes devant prendre un foncteur en argument perdent une grande partie de leur interêt.
Partager