7
votes

C ++ dérive d'un type natif

Dans certains CODE C ++, j'utilise des entiers pour stocker de nombreux données changeantes. Pour analyser mon programme, je souhaite connecter certaines modifications à certaines variables, telles que la fréquence à laquelle une certaine valeur est attribuée, et la fréquence à laquelle cette affectation est redondante (la nouvelle valeur est identique à celle de l'ancienne valeur.)

Si le type était une classe FOO, je voudrais simplement dériver un nouveau journalfoooo et ajouter mes données de journalisation à la fonction de membre qui m'intéressait, puis appelez la fonction membre parent. Je devrais mettre à jour mon code pour utiliser le nouveau type, mais aussi longtemps que j'étais cohérent à l'origine avec Typefs, c'est un changement à une ligne.

Mon problème est que la variable que je veux ajouter de la journalisation est une int. Vous ne pouvez pas dériver de types intégrés en C ++ (vous pouvez?)

Ma question est de savoir s'il existe un moyen intelligent de dériver des types de base (int, flotteur, double, etc.).

La solution peut être de définir une nouvelle classe qui efficacement est un int .. Il définit chaque opération AT peut faire et applique simplement cette opération à un INT privé Membre de données. Cette stratégie fonctionnera, mais peut-être d'autres ont déjà fait une telle classe et je peux simplement utiliser une définition de fichier "Fakeint.h". Y a-t-il des définitions de type de type "proxy natif de classe natif" déjà disponible quelque part avant de les mettre en œuvre moi-même?

Je réalise bien sûr que mon proxy int ne peut pas être utilisé de manière interchangeable avec un Int, en particulier depuis que les définitions de fonction existantes s'attendent à AT .. Mais pour mon application, tout est dans une boucle intérieure qui fait beaucoup de natifs simples + - * ^ = Opérations, non utilisées comme arguments de la fonction ou quoi que ce soit.


2 commentaires

Vous devriez examiner les opérateurs de Boost: boost.org/doc/libs /1_39_0/libs/utility/opérators.htm . Cela vous permettra de créer une classe qui dispose de tous les opérateurs typiques de le faire agir comme un type d'entier natif.


@Évan .. Merci, c'est une bonne ressource en général! Overkill pour ce dont j'ai besoin, mais si je devais rouler la mienne, cela coupa de manière significative le travail redondant.


4 Réponses :


9
votes

Vous ne pouvez pas dériver une classe d'int, mais vous devriez être capable de faire une classe (par exemple entier ) qui est interchangeable avec int en implémentant les données concrètes de Coplein Tapez idiom de Advanced C ++: styles de programmation et idiomes et Ensuite, en surchargeant l'opérateur de type Cast de integer à int et définissant un opérateur de conversion à partir de int sur integer . < / p>

Voici un autre lien qui décrit la base idiomes Du livre

Et pourtant un autre lien que je pense est assez proche de ce que vous recherchez http://fr.wikibooks.org/wiki/more_c%2b%2b_idioms/int-to-type


0 commentaires

-1
votes

Vous ne pouvez jamais dériver de types primitifs


1 commentaires

Certes, mais il y a d'autres choses qui peuvent être faites, ce qui est probablement pourquoi vous avez eu le vote au bas (de quelqu'un d'autre).



8
votes

Quelque chose comme ça ... xxx

Ceci créera une classe de modèle convertible vers le type d'origine dans les deux directions. Vous auriez besoin d'ajouter des opérateurs de manutention et de surcharge de journalisation pour chaque opération utilisée sur ce type dans votre code.

Cela pourrait toujours ne pas être tout ce que vous voulez, car il est implicitement convertible à INT (ou quel que soit le type Spécifiez), votre code pourrait donc convertir silencieusement votre journalisation INT vers un int et vous resteriez avec des journaux incomplets. Vous pouvez l'empêcher dans un sens en ajoutant un mot-clé «explicite» au constructeur, mais vous ne pouvez rien faire de similaire avec l'opérateur de conversion. Sauf si vous le faites peut-être privé ... je n'ai pas essayé. Faire de ces choses quelque peu vaincre le but cependant.

EDIT : Etant donné C ++ 11, vous pouvez ajouter explicite aux opérateurs de conversion.


1 commentaires

Cela se sent très très prometteur. Il a l'appel que tout fonctionne par défaut et que les seuls funcs que je dois envelopper sont ceux que je veux faire face à la journalisation personnalisée. Il presque fonctionne! i = i + 1; est ok. Cout << I; est ok. Mais par exemple i + = 1; ou i ++; ne fait pas. Pourtant, cela peut bien fonctionner pour remplir la plupart des opérateurs et je peux gérer manuellement le reste.



3
votes

Ceci est en fait un cas où #define strong> est très utile. Je recommande

#ifdef DEBUG
#    define INTGR MyDebugIntegerClass
#else
#    define INTGR int
#endif


1 commentaires

Oui, j'ai déjà Tapefs. Il est donc encore plus facile. Ma question principale construit efficacement une mydebugintegerclass sans avoir à envelopper manuellement plus de 50 opérateurs de Native Int. (Ou juste trouver quelqu'un qui l'a déjà fait.)