On 20 mar, 22:00, Michel Decima <michel.dec...@wanadoo.fr> wrote:
> zais ethael a écrit :
> > On 20 mar, 10:34, Michel Decima <michel.dec...@orange-ft.com> wrote:
> >> En fait si, tu peux le faire, a condition que
> >> get_log_stream renvoie un proxy copiable, avec un comptage
> >> de reference et un operator<< template qui prend en premier
> >> argument un const :
> >> template< typename T >
> >> inline OutputStreamWrapper const&
> >> operator<<( OutputStreamWrapper const& dest, T const& src )
> >> {
> >> if ( std:
stream* target = dest.getStream() ) {
> >> *target << src;
> >> }
> >> return dest;
> >> }
> > Une remarque pour dire qu'il y a une petite subtilité. J'ai
> > déjà du le faire et ça ne fonctionnait pas parfaitement,
> > bizarrement les manipulateurs passaient mal. Il faut aussi
> > rajouter 2 ou 3 méthodes définies dans std::iostream (ou une
> > classe de base) en plus d'un opérateur << généraliste (ça
> > fait un bout de temps, je ne me souviens plus lesquelles ni
> > comment j'avais déduit qu'il fallait les définir, mais je me
> > souviens que j'avais bien galèré).
> Effectivement, ca ne suffit pas, je n'avais pas tout dit. Pour
> les manipulateurs sous forme de pointeurs de fonctions (ie
> ceux qui ne sont pas dans <iomanip>) il faudra ajouter deux
> operateurs :
> inline OutputStreamWrapper const&
> operator<<( OutputStreamWrapper const& dest,
> std::ios_base& ( *src )( std::ios_base& ) )
> {
> if ( std:
stream* target = dest.getStream() ) {
> *target << src;
> }
> return dest;
> }
> inline OutputStreamWrapper const&
> operator<<( OutputStreamWrapper const& dest,
> std:
stream& ( *src )( std:
stream& ) )
> {
> if ( std:
stream* target = dest.getStream() ) {
> *target << src;
> }
> return dest;
> }
> je viens de refaire le test, et j'ai bien l'impression que le
> premier est inutile (std::hex peut passer par la version
> generique) alors que le second est necessaire pour
> std::endl... bizarre.
En effet. Comme a dit Jean-Marc, std::hex n'est pas un
template, donc, pas de problème avec la version générique.
En fait, j'ai rencontré le problème avec std::endl, qui lui
prend comme paramètre un std::basic_ostream<> (et donc, est un
template). Sachant qu'il y a aussi beaucoup de manipulateurs
bi-directionnels, j'ai ajouté en même temps une spécialisation
pour eux. Sans trop y reflechir sur le fait que std::ios_base
n'est pas un template. Et évidemment, puisque le code passait
tous les tests par la suite, je ne me suis plus posé de
question.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34