C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Re: heritage ostream

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Christophe Lephay
Guest





PostPosted: Tue Jul 22, 2003 5:57 pm    Post subject: Re: heritage ostream Reply with quote



"frederic blain" <blainfr (AT) wanadoo (DOT) fr> a écrit dans le message de
news:20030722192614.5c1e6d18.blainfr (AT) wanadoo (DOT) fr...
Quote:
J'ai cependant la necessite de detecter la fin d'une sequence
d'operateurs <<, afin de pouvoir emettre le bon message dans
syslog.

log << "hello" << "world";
^^^
fin de sequence

J'ai donc intergre une enum pour pouvoir faire :
log << "hello" << "world" << Log::eom
^^^^^^^^
mon enum
en rajoutant une methode
Log::operaor<< (enum e_end_message);

Cependant cela ne fonctionne que dans le seul cas ou mon enum est en
premiere position, ce qui est normal. (le stream renvoye est celui
de ostream, et non celui de ma classe dans les autres cas)

Si quelqu'un saurait comment resoudre mon probleme ou aurait une autre
solution pour detecter la fin d'une sequence Wink

tu peux peut-être passer par la création d'un temporaire, qui sera détruit à
la fin de l'expression :

class Eom
{
Log * log
public:

Eom() : log( null ) {}

~Eom()
{
if( log )
*log <<("fin de séquence");
}

friend class Log;
};

Log& Log::operaor<< ( Eom& eom )
{
eom.log = this;
return *this;
}

....
log << "hello, " << Eom() << "World !";

Eom crée un objet temporaire qui sera détruit à la fin de l'instruction...

Chris



Back to top
Jean-Marc Bourguet
Guest





PostPosted: Tue Jul 22, 2003 6:00 pm    Post subject: Re: heritage ostream Reply with quote



frederic blain <blainfr (AT) wanadoo (DOT) fr> writes:

Quote:
Cependant cela ne fonctionne que dans le seul cas ou mon enum est en
premiere position, ce qui est normal. (le stream renvoye est celui
de ostream, et non celui de ma classe dans les autres cas)

3 solutions:

1/ tu définis un operator<<(osteam&, enum)
dans lequel tu fais un dynamic_cast

2/ tu définis une fonction eom(ostream&) qui fait ce que tu ferais
dans l'operator<< (donc dynamic_cast etc...) et tu l'utilises à la
place de l'enum

3/ tu utilises la durée de vie des temporaires et tu fais
Log() << "hello" << " world";
et le destructeur de Log fait ce qu'il faut.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Wed Jul 23, 2003 9:29 am    Post subject: Re: heritage ostream Reply with quote



Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> wrote

Quote:
frederic blain <blainfr (AT) wanadoo (DOT) fr> writes:

Cependant cela ne fonctionne que dans le seul cas ou mon enum est en
premiere position, ce qui est normal. (le stream renvoye est celui
de ostream, et non celui de ma classe dans les autres cas)

3 solutions:

1/ tu définis un operator<<(osteam&, enum)
dans lequel tu fais un dynamic_cast

2/ tu définis une fonction eom(ostream&) qui fait ce que tu ferais
dans l'operator<< (donc dynamic_cast etc...) et tu l'utilises à la
place de l'enum

3/ tu utilises la durée de vie des temporaires et tu fais
Log() << "hello" << " world";
et le destructeur de Log fait ce qu'il faut.

J'utilise prèsqu'exclusivement la solution 3. La plupart du temps,
j'utilise un « wrapper », afin que l'objet Log puisse être renvoyé d'une
fonction -- l'objet pourrait par exemple dépendre du fichier de
configuration, etc. (L'important, dans ce cas-là, c'est qu'on ne sait
pas a priori combien de temporaires intermédiaire il va y avoir. On les
compte donc, et on fait le traitement de fin quand le dernier est
detruit.)

J'ai une implementation générique (GB_OutputStreamWrapper) à ma site,
mais c'est peut-être un peu trop pour des cas simple. En revanche, en le
combinant avec GB_EventGeneratingOutputStream, on arrive à une gestion
de log extrèmement souple (mais complex, et qui ne se justifie que dans
des applications vraiement grandes).

--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.