J'utilise des gabarits pour implémenter une conversion vérifiée de gamme de int à enum. Il ressemble à ceci:problème de spécialisation de fonction de gabarit
template<typename E>
E enum_cast(const int &source);
La fonction de modèle placée plus ou moins dans le root-directoy du projet. Lors de la définition d'une nouvelle ENUM qui est prévu pour être attribué des valeurs à partir d'un fichier de configuration comme ceci:
enum ConfigEnum {
ConfigEnumOption1 = 'A'
, ConfigEnumOption2 = 'B'
, ConfigEnumInvalid };
ConfigEnum option = XmlNode.iAttribute("option");
Je définis une spécialisation de modèle pour ce type particulier de ENUM dans un .cpp fichier pour le module ce ENUM est utilisé dans .
template<>
ConfigEnum enum_cast(const int &source) {
switch(source) {
case ConfigEnumOption1 : return ConfigEnumOption1;
case ConfigEnumOption2 : return ConfigEnumOption2;
default return ConfigEnumInvalid;
}
maintenant, l'affectation d'un int au ENUM devient:
ConfigEnum option = enum_cast<ConfigEnum>(XmlNode.iAttribute("option"));
qui veille à ce que l'ENUM est AllWays dans la plage valide. Notez que je n'ai pas toujours le contrôle sur ces énumérations donc cela semble être une solution raisonnable et facilement configurable.
Quoi qu'il en soit, cela fonctionne très bien (même si je ne suis pas shure tout le code donné ici est correct parce que je me souviens juste de la mémoire en ce moment)
Le problème vient du fait qu'il pourrait être souhaitable d'utiliser cette construction "enum_cast" s'étendant sur la base de code chaque fois qu'un in est assigné à une énumération. Après tout cela peut être appliqué par une simple opération de recherche et de remplacement. Bien sûr, je ne veux pas définir ces spécialisations pour tous et chaque énumération, mais seulement pour ceux qui ont besoin de la vérification de gamme pour le moment. Je préférerais ajouter des spécialisations de gabarit pour les types d'énumération lorsque le besoin s'en fait sentir et utiliser l'opérateur d'affectation lorsqu'aucune spécialisation n'est définie.
Ainsi:
InternalEnum internal = enum_cast<InternalEnum>(internal_integer);
appellerait effecively interne = internal_integer. Je suppose que je dois dire au compilateur d'utiliser une certaine implémentation "par défaut" pour tous les types d'énumération qui n'ont pas de spécialisation.
Mon premier pari a été de donner la fonction de modèle d'origine d'une mise en œuvre comme celui-ci:
template<typename E>
E enum_cast(const int &source) {
E copy = source;
return copy;
};
Malheureusement maintenant c'est AllWays appelé au lieu des specialiazations données dans les fichiers .cpp plus profonds dans le projet répertoire arbre.
Des pensées?
Merci à l'avance Arne
merci pour l'indice - comme d'habitude c'est facile une fois que vous connaissez la réponse ;-) – Arne