Afficher un message
Vieux 20/03/2008, 22h00   #5
Michel Decima
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: C++0X : Rvalue references

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.


  Réponse avec citation
 
Page generated in 0,06158 seconds with 9 queries