Question

C++ 0x a des alias de modèle (parfois appelés typedefs de modèle).Voir ici.La spécification actuelle de C++ ne le fait pas.

Qu’aimez-vous utiliser comme solution de contournement ?Objets conteneurs ou macros ?Pensez-vous que cela en vaut la peine ?

Était-ce utile?

La solution

Qu’aimez-vous utiliser comme solution de contournement ?Objets conteneurs ou macros ?Pensez-vous que cela en vaut la peine ?

La manière canonique consiste à utiliser une métafonction comme ceci :

template <typename T>
struct my_string_map {
    typedef std::map<std::string, T> type;
};

// Invoke:

my_string_map<int>::type my_str_int_map;

Ceci est également utilisé dans la STL (allocator::rebind<U>) et dans de nombreuses bibliothèques dont Boost.Nous l'utilisons largement dans un bibliothèque bioinformatique.

C’est gonflé, mais c’est la meilleure alternative dans 99 % des cas.Utiliser des macros ici ne vaut pas les nombreux inconvénients.

(MODIFIER:J'ai modifié le code pour refléter les conventions Boost/STL comme l'a souligné Daniel dans son commentaire.)

Autres conseils

template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};

Vous ne devriez pas hériter de classes qui n'ont pas de destructeur virtuel.Cela est lié au fait que les destructeurs des classes dérivées ne sont pas appelés alors qu'ils devraient l'être et que vous pourriez vous retrouver avec de la mémoire non allouée.

Cela étant dit, vous pourriez *****probablement***** vous en sortir dans l'exemple ci-dessus, car vous n'ajoutez plus de données à votre type dérivé.Notez qu’il ne s’agit pas d’une approbation.je te conseille quand même ne le faites pas fais-le.Le fait que tu peut ça ne veut pas dire toi devrait.

MODIFIER:Oui, ceci est une réponse au message de ShaChris23.J'ai probablement raté quelque chose car il apparaissait au-dessus de son message plutôt qu'en dessous.

Parfois, vous pouvez simplement écrire explicitement les typedefs non modélisés pour tous les types nécessaires.Si la classe de base est basée sur plusieurs arguments de modèle avec un seul type que vous souhaitez typer, vous pouvez hériter d'une classe spécialisée avec typedef effectivement inclus dans le nom de classe hérité.Cette approche est moins abstruse que l’approche métafonctionnelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top