Récemment, j'ai utilisé l'une des fonctionnalités STL les moins utilisées, les allocateurs personnalisés, et j'ai besoin d'une aide sérieuse pour réduire mes frais généraux sémantiques. Prenons par exemple la définition d'une carte non ordonnée, qui mappe des noms de fichiers sur une carte non ordonnée d'une paire d'ints et d'une shared_ptr vers un Token, mais en utilisant un allocateur personnalisé.Réduction de la complexité des gabarits en C++
typedef std::pair<int, int> token_key_type;
typedef std::unordered_map<
token_key_type,
std::shared_ptr<Token>,
std::hash<token_key_type>,
std::equal_to<token_key_type>,
Allocator<
std::pair<
const token_key_type,
std::shared_ptr<
Token
>
>
>
> filename_map_value_type;
std::unordered_map<
string,
filename_map_value_type,
std::hash<string>,
std::equal_to<string>,
Allocator<
std::pair<
const string,
filename_map_value_type
>
>
> tokens;
Cela correspond à 404 caractères de définitions. Et puis pour le construire, je dois passer à la valeur par défaut pour chaque argument template, excepté l'Allocator, qui ne peut pas être construit par défaut, ET le nombre de godets, pour lequel aucune définition n'existe, résultant en 168 caractères juste pour construire le fichue chose. Plus, bien sûr, la même chose chaque fois que je veux insérer, car le type de valeur de la première carte doit être construit comme ça aussi.
Est-il possible que tout cela puisse être évité sans avoir à écrire ma propre carte non-ordonnée? Cela commence sérieusement à ralentir ma productivité.
Editer: Désolé! Je voulais dire, en général, pour les conteneurs STL, pas seulement unordered_map, c'est juste le pire des cas. J'ai aussi ce problème avec map, unordered_set, etc, et je ne peux pas écrire une fonction pour faire tout cela pour tous les conteneurs STL dont j'ai besoin.
Vous recherchez peut-être une instanciation de modèle partielle? http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cpp/2004-08/2307.html –