Pages

samedi 10 novembre 2012

Alias templates

Ce message comme les quelques-uns qui suivront, sont dédiés aux nouveautés qu'apportent le C++11 et les parties déjà implémentées par gcc-4.7.

Pour aujourd'hui ce sera les alias sur templates. Qui n'a jamais eu envie de faire un typedef sur une structure template, définir quelques paramètres en dur et laisser les autres variables ? Définir par exemple une map qui contient des clefs en string et des valeurs définies par l'utilisateur ?

En C++89 c'est possible en passant par un intermédiaire: un trait.

template<typename _T>
struct build_map_key_string
{ typedef std::map<std::string, _T> type; };
//...
build_map_key_string<int>::type strmap;

Pas très beau :/.

Maintenant c'est possible de le faire de façon transparente, exactement comme avec un typedef. Sauf que typedef, en C++11, c'est dépasser, le nouveau mot clef à utiliser est using ‑même si pour la compatibilité typedef est toujours existant.

template<typename _T>
using map_key_string = std::map<std::string, _T>;
//...
map_key_string<int> strmap;

Simple et efficace !

J'hésitais à l’utiliser dans falcon mais depuis qu'un test echoué en gcc-4.6 est passé en gcc-4.7 je me suis mis à l'utiliser. Un exemple se trouve dans falcon/iterator/indirect_iterator.hpp où on peut voir un code vachement simplifié: un alias contre un héritage (les 2 y sont ;)). Je l'utilise également dans mon module property ce qui permet de simplifier l'utilisation compliquée d'une classe générique et cela de façon très élégante.

Aucun commentaire: