IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Flux et préprocesseur .


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut Flux et préprocesseur .
    Bonjour, toujours dans le but d'écrire une classe de type " logger" pour mon projet, je me suis heurté a quelques problèmes de conceptions .

    J'aimerai obtenir une syntaxe proche de ca :

    Log(FILE|CONSOLE,WARNING) << "Ma variable i vaux : " << i << "\n" ;

    Bah c'est pas facile ....


    Je me heurte a plusieurs problèmes :

    Le premier :
    - Je veux que certains lod ne soit pas présent lors d'un build ( debug/release peut importe ) . Par exemple, que tout ceux dont le type est " WARNING , ou MISC" soit enlevé, mais que je garde ceux nommé "ERROR" par exemple ).

    Typiquement, je ne vois pas comment ( si c'est possible ... ) gardé certaine lignes en fonction d'un argument :
    ex : Test(a)

    ( test étant une macro, je veux garder seulement lors d'un build les Test(a) avec a =2, le reste je n'en veux pas ... )

    [ je veux eviter de devoir passer par un Log_Warning(...) Log_Error(...) ]


    Ensuite, j'ai du mal avec les flux . Je ne vois pas comment m'en sortir proprement .
    Avec une ligne de code tel que je l'ai énoncé en debut de post, je veux pouvoir aboutir à l'apelle d'une fonction ( ou de plusieur, selon les flag en paramètre ) de ce type:

    WriteConsole(...)
    WriteFile(...)

    Avec en paramètre :
    Un string représentant le message TOTAL ( dans mon cas et pour i = 12 )
    MsgString = "Ma variable i vaux 12 \n"
    ET certaines macro en paramètre ( genre __FILE__, __LINE__ ... )

    bref une fonction de ce type :
    WriteFile(int EventType ,string Msg, const char * Line, const char * File )

    [ EventType étant : WARNING , ERROR, MISC ... ect ... ]

    En gros ce qu'il me manque, c'est le lien entre le chainage de flux et l'apelle a Write()

    Résumer : Comment a l'aide de macro, ne pas "expand" ma macro selon la velur d'un de ces paramètre ? Et comment reconsituer mon message lors d'un chainage de flux ? [ et accesoirement, comment extraire proprement mes types d'ouput ( FILE , CONSOLE , SCREEN ... ) de ma macro .

    Je suis sur que ce n'est pas clair ... mais merci quand même
    [ je referai ce soir quelque chose de plus propre si c'est vraiment trop le bordel . ]

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Pour ton premier problème, le seul moyen que je vois est de jouer avec la spécialisation des templates. Ce qui implique -- mais tu devais déjà le savoir -- que le deuxième argument devra toujours être constant.

    Pour le deuxième problème, le seul moyen d'utiliser __FILE__ et __LINE__ c'est que l'expansion de Log les contiennent.

    Quand à la l'envoi du message, soit tu le synchronise avec la destruction d'un objet temporaire créé par Log (ce qui a l'inconvénient de ne pas pouvoir bâtir un message en plusieurs fois). Soit tu le fais quand ton streambuf recois un flush.

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    Merci :
    Pour ton premier problème, le seul moyen que je vois est de jouer avec la spécialisation des templates. Ce qui implique -- mais tu devais déjà le savoir -- que le deuxième argument devra toujours être constant.
    En fait je ne vois pas de quel genre de solution tu parle, et de plus, mes 2 paramètres sont variables ...

    Je peux procéder ainsi sinon, mais ca ne résoud pas le problème, car ca me génère un "if", même lorsque je veux totalement eradiqué ce genre de log :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define Log(p) if(p=="WARNING" || p =="ERROR") std::cout << p << std::endl ;
    Pour le deuxième problème, le seul moyen d'utiliser __FILE__ et __LINE__ c'est que l'expansion de Log les contiennent.
    Je me suis mal exprimé, car ca , j'en suis bien au courant

    Quand à la l'envoi du message, soit tu le synchronise avec la destruction d'un objet temporaire créé par Log (ce qui a l'inconvénient de ne pas pouvoir bâtir un message en plusieurs fois). Soit tu le fais quand ton streambuf recois un flush.
    Ca, ca demande réflexion parcontre je vais voir si il y a moyen de faire qquchose comme ca, sans alourdir la syntaxe de mon log .

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Clad3
    En fait je ne vois pas de quel genre de solution tu parle, et de plus, mes 2 paramètres sont variables ...
    Si le deuxième paramètre peut être calculé tout juste avant l'appel, je me demande comment tu peux rêver éliminer tout code suivant sa valeur.
    S'il est constant, je voulais m'en servir comme paramètre template, et avoir des spécialisations explicites qui suppriment tout le code pour autant que le compilateur ne soit pas trop mauvais dans l'inlining de fonctions complètement vides.

    Au fait, je crois que boost a quelque chose pour les logs.

  5. #5
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    Oui j'avais mal compris, en effet mes 2 paramètres sont connu à la compilation

    Enfin cela-dit, j'ai toujours du mal a voir quel genre de code tu veux produire, tu aurais un petit exemple, histoire de me dé-flouter ?

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Clad3
    Enfin cela-dit, j'ai toujours du mal a voir quel genre de code tu veux produire, tu aurais un petit exemple, histoire de me dé-flouter ?
    Quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    template <bool dropItAll> struct Logger;
    template<> struct Logger<true> {
       Logger(...) {}
       template<typename T> Logger& operator<<(T const&) { return *this;}
    };
     
    template<> struct Logger<false> {
       Logger(...) {}
       ~Logger() { std::cerr << str_.str() << std::endl; }
       template<typename T> Logger& operator<<(T const&t) { str_ << t; return *this; }
    private:
       std::stringstream str_;
    };
     
    enum Severity { debug, log, warning, error};
    #define Log(a, b) Logger<b==debug>(a, b)
    à complèter pour la gestion des __LINE__, __FILE__ etc...

Discussions similaires

  1. [Servlet][Deb]envoyer image gif sur le flux http
    Par ptitBoutchou dans le forum Servlets/JSP
    Réponses: 15
    Dernier message: 09/04/2004, 10h12
  2. Acquerir un flux audio
    Par The Cyber Lewis dans le forum DirectX
    Réponses: 1
    Dernier message: 05/04/2004, 14h13
  3. Rediriger un flux de données sous linux
    Par Nicaisse dans le forum POSIX
    Réponses: 7
    Dernier message: 01/07/2003, 16h04
  4. Copie d'un flux dans un autre
    Par Morvan Mikael dans le forum Langage
    Réponses: 5
    Dernier message: 03/06/2003, 09h40
  5. [reseaux] redirection de flux
    Par Olive1808 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 12/08/2002, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo