8
votes

Question de traits C ++

J'ai une classe modélisée xxx

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.

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).

Mes options (s'il vous plaît dites-moi s'il y en a plus)

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.

Questions

1) Quels sont les mérites relatives de 1 VS 2?

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.

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?


0 commentaires

3 Réponses :


2
votes

1) Quels sont les mérites relatives de 1 vs 2?

wrappers autour de conserver c simple. Les traits gardent les bâtiments intégrés. :)
Vous pouvez également essayer de prendre en compte le code qui diffère en fonction des données dans un modèle de classe de base et de spécialiser cela.

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.

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 sur d'autres types. En ce qui concerne le comportement , je préférerais appeler cela une politique. Je vois cependant que std :: char_traits ne correspond pas à ces définitions. : ( Quoi qu'il en soit, si cela a des membres non statiques, il a un État, et je n'appellerais plus ces traits.

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?

Passer comme un paramètre de modèle ne fait que sens de vous souhaiter que les utilisateurs de C fournissent leurs propres traits pour tout ce qu'ils passent en tant que données . S'il y aura toujours un modèle de traits pour int la classe peut simplement l'utiliser. Si les utilisateurs peuvent proposer leurs propres traits pour int , ils ont besoin d'un moyen de le transmettre à C .


0 commentaires

0
votes

une demi-douzaine de chacun? Je ne connais pas de une raison priori 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.

C'est vraiment une question de détails et que vous ne leur avez pas fourni.


0 commentaires

7
votes

Vous pouvez spécialiser une partie de la classe comme suit: xxx

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 C plusieurs fois.

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 data et data * Types de cette manière.


3 commentaires

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 existe dans les deux cas, pas besoin de le réécrire.