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 :

[C++] Factorisation de code


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    82
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 82
    Par d�faut [C++] Factorisation de code
    J'ai une collection de classes, qui doivent toutes fournir une fonction membre statique retournant un pointeur vers une chaine de caract�re. Je souhaiterais factoriser au maximum mon code.

    Voici mon approche sachant que ca coince � la compilation.

    Je fais un mod�le qui prend en argument la chaine de caract�re et qui impl�mente la fonction statique :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    template< char const * str>
    struct Base
    {
      inline static char const * affiche() { return str; }
    };
    Ensuite, je fais h�riter toutes mes classes de ce modele en le sp�cialisant :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    struct A : Base<"A"> { /**/ };
    struct B : Base<"B"> { /**/ };
    struct C : Base<"C"> { /**/ };
    struct D : Base<"D"> { /**/ };
    Le compilateur ne semble pas appr�cier l'instanciation du modele. J'ai tent� de contourner le probleme en stockant la chaine dans une variable char const * int�rm�diaire mais sans plus de succ�s car d'autres erreurs apparaissent.

    Toutes suggestions sont les bienvenues. Ma conception object n'est peut etre pas optimale au dela du probleme de syntaxe.

    Xter.

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Euh... Je connais mal le C++, mais je ne suis pas certain que les templates acceptent une param�tre pointeur...

    Pourquoi ne pas utiliser simplement des macros comme le fait MFC ?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #define BEGIN_STRUCT(name) struct name {\
    inline static char const * affiche() { return #name; }\
    #define END_STRUCT };
     
    BEGIN_STRUCT(A)
    	//...
    END_STRUCT
     
    BEGIN_STRUCT(B)
    	//...
    END_STRUCT
    Et encore, tu n'es pas oblig� de mettre le end, tu peux juste mettre };
    Ou encore, tu peux toujours mettre juste la fonction dans la macro, et appeler la macro depuis l'int�rieur des accolades...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre chevronn�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par d�faut
    Effectivement les templates ne prennent que des types ou des constantes enti�res en param�tres, donc �a en peut pas marcher.

    Voil� une solution fonctionnant avec les templates, bas�e sur le CRTP et un peu plus propre (� mon go�t) que les macros :

    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
    17
    18
     
     
    template <class Derived> struct Base {
     
        inline static char const* affiche() {return Derived::name;}
     
    };
     
    struct A : public Base<A> {
     
        private:
            static const char* name;
     
            friend class Base<A>;
     
    };
     
    //ne pas oublier de définir la variable dans le .cpp

  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
    On peut avoir des param�tres templates qui sont des objets, mais il faut qu'ils aient un linkage externe.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template< char const * str>
    struct Base
    {
      inline static char const * affiche() { return str; }
    };
     
    extern char const Aname[]="A";
     
    struct A : Base<Aname> {};
    Il faut le extern pour �viter que Aname ait un linkage interne.

  5. #5
    Membre chevronn�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par d�faut
    Merci de l'information

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    82
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 82
    Par d�faut
    Tout type int�gral (et leur pointeur) est accept� en param�tre d'un modele !

    Jean-Marc, merci pour cette r�ponse rapide. J'avais tent� un static en pr�fixe sans succ�s sentant bien que le probl�me venait de ce que tu as expliqu�. J'ai confondu avec extern que je n'ai plus utilis� depuis longtemps !!!

    Xter.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Factorisation de code graphique
    Par jsebfranck dans le forum Windows Forms
    R�ponses: 7
    Dernier message: 01/05/2008, 01h12
  2. factorisation de code
    Par calagan99 dans le forum ASP.NET
    R�ponses: 7
    Dernier message: 21/05/2007, 09h00
  3. factoriser du code
    Par grabriel dans le forum Langage
    R�ponses: 3
    Dernier message: 26/10/2006, 15h00
  4. R�ponses: 7
    Dernier message: 01/08/2006, 11h58
  5. R�ponses: 4
    Dernier message: 06/11/2003, 10h37

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