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.) p>
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. P>
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?) P>
Ma question est de savoir s'il existe un moyen intelligent de dériver des types de base (int, flotteur, double, etc.). p>
La solution peut être de définir une nouvelle classe qui 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. p>
4 Réponses :
Vous ne pouvez pas dériver une classe d'int, mais vous devriez être capable de faire une classe (par exemple Voici un autre lien qui décrit la base idiomes a > Du livre p>
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 p> entier code>) qui est interchangeable avec int code> 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 code> à int code> et définissant un opérateur de conversion à partir de int code> sur integer code>. < / p>
Vous ne pouvez jamais dériver de types primitifs p>
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).
Quelque chose comme ça ... 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. P> 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. P> explicite Code> aux opérateurs de conversion. P> p>
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 b> 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.
Ceci est en fait un cas où #ifdef DEBUG
# define INTGR MyDebugIntegerClass
#else
# define INTGR int
#endif
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.)
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.