2009-09-24 8 views
26

J'essaye de typedef soit unordered_map ou std :: map selon s'il y a des librairies TR1 disponibles. Mais je ne veux pas spécifier les paramètres du modèle. De ce que j'ai lu jusqu'ici, typedef'ing modèles sans arguments n'est pas possible jusqu'à ce que le standard officiel C++ 0x est disponible. Donc, quelqu'un sait-il une solution de contournement élégante pour cela?Typedef une classe de modèle sans spécifier les paramètres de modèle

#ifdef _TR1 
#include <unordered_map> 
typedef std::tr1::unordered_map MyMap; //error C2976: too few template arguments 
#else 
#include <map> 
typedef std::map MyMap; //error C2976: too few template arguments 
#endif 
+0

Voir cette question très proche: http://stackoverflow.com/questions/544842/c-typedef-ing-stl et les réponses fournies. Les typedefs de template ne sont pas valides. Commandes C++ –

+1

Benoit - Merci, c'est exactement ce que je cherchais –

+0

Question très similaire: http://stackoverflow.com/questions/6907194/how-to-typedef-a-template-class Il en a un autre réponse qui n'est pas mentionnée ici: "alias template" en C++ 11 – Jayesh

Répondre

36

La façon dont je l'ai vu faire est d'envelopper le typedef dans un modèle-struct:

template<typename KeyType, typename MappedType> 
struct myMap 
{ 
#ifdef _TR1 
    typedef std::tr1::unordered_map<KeyType, MappedType> type; 
#else 
    typedef std::map<KeyType, MappedType> type; 
#endif 
}; 

Puis dans votre code vous invoquez comme ceci:

myMap<key, value>::type myMapInstance; 

Il est peut-être un peu plus verbeux que ce que vous voulez, mais je crois qu'il répond à la nécessité compte tenu de l'état actuel du C++.

+3

C'est en effet la manière habituelle de simuler l'absence de template typedefs en C++. Cependant, j'aurais nommé le typedef "type" au lieu de "value", il semble plus correct sémantiquement et il est plus idiomatique. –

+1

Code mis à jour, merci – fbrereto

4

Vous devez utiliser des types complets pour les typedefs.

Utilisez plutôt une macro #define.

+1

Il est parfois préférable de se rabattre sur les vieilles méthodes. Programmation de bande de conduit à son meilleur. –

+4

Malheureusement, les macros ne respectent pas la portée. – sellibitze

Questions connexes