Comment utiliser ma classe de journalisation comme un flux C ++ std?
J'ai un travail enregistreur de classe, qui affiche du texte dans une richtextbox (Win32, C++).
Le problème est, je finis toujours l'utiliser comme ceci:
stringstream ss;
ss << someInt << someString;
debugLogger.log(ss.str());
au lieu de cela, il serait beaucoup plus pratique de l'utiliser comme un torrent, comme dans:
debugLogger << someInt << someString;
Est-il un meilleur moyen que la redirection de tout à l'interne stringstream exemple? Si le ferais, quand j'ai besoin de rincer?
source d'informationauteur newgre | 2009-02-04
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour mettre en œuvre
operator <<
appropriée pour votre classe. Le modèle général ressemble à ceci:Avis que cette traite (non-
const
) références depuis l'opération modifie votre enregistreur. Notez également que vous devez retourner lelog
paramètre pour le chaînage de travail:Si les recoins les plus profonds de l'opération n'a pas renvoyé de l'actuel
log
exemple, toutes les autres opérations seraient pas au moment de la compilation (mauvaise méthode de signature) ou allaient être engloutis au moment de l'exécution.La surcharge de l'opérateur d'insertion<< n'est pas la voie à suivre. Vous devrez ajouter des surcharges pour tous les endl ou toutes les autres fonctions définies par l'utilisateur.
Le chemin à parcourir est de définir votre propre streambuf, et de les lier dans un cours d'eau. Ensuite, vous avez juste à utiliser le flux de données.
Voici quelques exemples simples:
Dans l'Enregistreur de classe, remplacer les << opérateur de.
Cliquez sur Ici de savoir comment mettre en œuvre les << opérateur de.
Vous pouvez éviter l'enregistrement des déclarations à l'intérieur du code
à l'aide de la programmation Orientée Aspects.
Luc hermitte (en)a notéil est "L'Enregistrement En C++" article qui décrit très soigné approche pour résoudre ce problème. En un mot, étant donné que vous avez une fonction comme suit:
il est possible d'écrire un wrapper pour l'utiliser dans std::cout comme:
(démo en ligne)
Aussi, il est très agréable de solution fournis par Stewart.
Une solution élégante qui résout également le rinçage des questions est la suivante: