dimanche 4 juillet 2010

C++0x - Initialisation

Vous en avez assez d'écrire des tartines de code pour initialiser vos conteneurs? Ça tombe bien, C++0x pense à vous! Sans plus attendre, comparez:


std::vector<int> vi;
vi.push_back(1);
vi.push_back(2);
vi.push_back(3);
vi.push_back(4);
vi.push_back(5);
à

std::vector<int> vi {1, 2, 3, 4, 5};

Cool, non? La bibliothèque boost::assign fournissait déjà des utilitaires similaires, mais c'est beaucoup plus facile à utiliser comme ça. Bien entendu, ça marche également pour les types plus complexes:

std::vector<std::string> vs {"a", "b", "c", "d"};


Et, cerise sur le gâteau, on peut imbriquer les initialisations:

std::vector<std::vector<int> > vvi {{1, 2}, {3, 4, 5}};

std::vector<std::vector<std::string> > vvs
{{std::string("a"), std::string("b")},
{ std::string("c"), std::string("d"), std::string("e")}};

Notez cependant que dans le second exemple, il faut passer le constructeur, car g++ (au moins) ne le fait pas implicitement comme pour l'exemple non-imbriqué.

Je trouve cette fonctionnalité particulièrement intéressante pour écrire des tests unitaires, car c'est typiquement là que l'on a besoin d'objets déjà définis. Plus d'excuses pour ne pas en écrire, donc!

Aucun commentaire: