J'ai une classe modélisée dans la plupart des situations, je dépend du compilateur pour me permettre de remplacer les types de données.
I méthodes d'appel foo (), goo () sur des objets de données de type, donc ce que je substitute doit fournir
cette. P> J'ai maintenant besoin de substituer Int et String pour mon type de données. Je ne veux pas spécialiser
Parce que la classe est déjà trop grosse et nécessiterait de spécialiser chaque méthode (avec seulement un petit changement de code). P> Mes options (s'il vous plaît dites-moi s'il y en a plus) p> 1) Je peux fournir des cours d'enveloppe autour de int et de la chaîne qui implémentent les méthodes foo (), goo (), etc. p> 2) fournir une classe de traits
traits qui appelle foo () ou goo () sur des objets de classes qui fournissent foo (), goo ()
(Ce sont mes classes substituables actuelles)
et spécialisez ces classes pour INT et String. P> Questions P> 1) Quels sont les mérites relatives de 1 VS 2? P> 2) Mes classes de traits auront des méthodes statiques. Une classe de traits peut-elle également avoir des méthodes non statiques? Je vois que la plupart des traits classes définissent des constantes dans la STL. P> 3) Est-ce que je fais des traits classes globales ou dois-je les transmettre en tant que paramètre de modèle
Pour la classe C? p> p>
3 Réponses :
1) Quels sont les mérites relatives de 1 vs 2? p> blockQuote>
wrappers autour de conserver
c code> simple. Les traits gardent les bâtiments intégrés.
:) code>
Vous pouvez également essayer de prendre en compte le code qui diffère en fonction des données code> dans un modèle de classe de base et de spécialiser cela. p>2) Mes traits classes auront des méthodes statiques. Une classe de traits peut-elle également avoir des méthodes non statiques? Je vois la plupart des traits classes définissent des constantes dans la STL. P> blockQuote>
Je ne suis même pas sûr que cela s'appelle toujours des "traits" si cela a un état.
FWIW, je classes généralement comme des traits que ceux qui donnent un facteur les informations em> sur d'autres types. En ce qui concerne le comportement em>, je préférerais appeler cela une politique. Je vois cependant questd :: char_traits code> ne correspond pas à ces définitions.
: ( code> Quoi qu'il en soit, si cela a des membres non statiques, il a un État, et je n'appellerais plus ces traits. p>
3) Est-ce que je fais des traits classes globales ou dois-je les transmettre en tant que paramètre de modèle pour la classe C? p> blockQuote>
Passer comme un paramètre de modèle ne fait que sens de vous souhaiter que les utilisateurs de
C code> fournissent leurs propres traits pour tout ce qu'ils passent en tant que données code>. S'il y aura toujours un modèle de traits pour
int code> la classe peut simplement l'utiliser. Si les utilisateurs peuvent proposer leurs propres traits pour
int code>, ils ont besoin d'un moyen de le transmettre à
C code>. p>
une demi-douzaine de chacun? Je ne connais pas de une raison priori i> d'utiliser un contre l'autre dans un sens générique. Aucun de ce que vous demandez me fait penser que vous devriez choisir l'un sur l'autre. La seule chose à laquelle je peux penser est que le choix 1 va probablement nécessiter moins de modifications apportées à la fonction existante. D'autre part, les clients ne seront pas en mesure de simplement utiliser la fonction sur les primitives sans créer l'emballage. P>
C'est vraiment une question de détails et que vous ne leur avez pas fourni. P>
Vous pouvez spécialiser une partie de la classe comme suit: la syntaxe ci-dessus autorisé par C ++ standard 14.7 / 3 et 14.5.2 / 2. Il n'est pas nécessaire de réécrire toutes les choses de la classe Remarque, qu'il n'est pas autorisé à spécialiser partiellement la classe de modèle de cette manière. Par exemple, vous ne pouvez pas définir différentes fonctions pour C code> plusieurs fois. P>
data code> et
data * code> Types de cette manière. P> p>
Merci. Je suis un peu confus par "Note, que vous ne pouvez pas particulièrement spécialiser la classe de manière aussi". S'il est garanti par la norme C ++, pourquoi n'est-ce pas possible? Si je me spécialise, je dois spécialiser toute la classe?
Il y a une différence entre "partiellement spécialisé" et "une partie de spécialisation complète d'une classe".
Vérifiez Cet échantillon . Notez que la fonction test code> existe dans les deux cas, pas besoin de le réécrire.