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

Langage C++ Discussion :

[Metaprog] static const vs enum


Sujet :

Langage C++

  1. #21
    screetch
    Invité(e)
    Par défaut
    si tu t'en fiches, l'API n'a pas a te présenter le fait que tu puisses choisir le type si en fait tu peux pas.
    ma critique, c'est que si on utilise un backend enum, le frontend ne doit pas te faire croire que tu utilises un bool.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BOOST_STATIC_CONSTANT(value = false);
    ne ment pas sur ce qu'elle fait, au moins, tout en gardant le fait que le backend peut etre différent suivant le compilateur. Cela ne change plus le comportement du programme suivant le compilo.

    apres je sais que beaucoup sont fans de boost, mais il faut savoir reconnaître du mauvais code quand on en voit, et ca malheureusement ca fait partie des choses a ne pas faire en programmation.

  2. #22
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Oula je t'arrêtes de suite. Comme je l'ai précisé plus haut, je prends pas au pied de la lettre tout code trouvé dans boost, j'essayais de trouver une explication.
    T'es pas d'accord avec ce qu'ils font, moi j'ai du mal à voir ce qui est gênant, enfin je vois ce que tu reproches hein, mais pour moi c'est pas quelque chose de gênant outre mesure ça fait plus parti de ces "hacks" qui sont pas beau mais qu'on fait.

    ps : pas le temps de développé plus... faut que j'y réfléchisse.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #23
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    sauf que, en pratique de métaprog, tu peux très bien avoir un truc du genre de
    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
    19
    20
    21
    22
    template <char c>
    class MyCharClass
    {
        public:
            enum{value =c};
    };
    template <short s>
    class MyShortClass
    {
        public:
            enum {value = s};
    };
    template <int i>
    class MyIntClass
    {
        public:
             enum {value = i};
    };
    template <template <class> class Trait>
    {
        BOOST_STATIC_CONSTANT(/* on met quoi, là? */, typename Trait::value);
    };
    (code écrit à la va vite, et non vérifié)

    Et qu'il ne faut pas te leurrer: une valeur énumérée a, par défaut, la taille d'un int...

    C'est à dire que, malgré tout ce qui est indiqué, MyCharClass::value et MyShortClass::value ont quoi qu'il arrive la taille d'un int

    Là où cela changerait, c'est si tu définis un trait pour les long ou les long long, et, effectivement, il ne passeraient alors pas avec boost sans avoir défini BOOST_NO_INCLASS_MEMBER_INITIALIZATION
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #24
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par koala01 Voir le message
    sauf que, en pratique de métaprog, tu peux très bien avoir un truc du genre de
    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
    19
    20
    21
    22
    template <char c>
    class MyCharClass
    {
        public:
            enum{value =c};
    };
    template <short s>
    class MyShortClass
    {
        public:
            enum {value = s};
    };
    template <int i>
    class MyIntClass
    {
        public:
             enum {value = i};
    };
    template <template <class> class Trait>
    {
        BOOST_STATIC_CONSTANT(/* on met quoi, là? */, typename Trait::value);
    };
    (code écrit à la va vite, et non vérifié)

    Et qu'il ne faut pas te leurrer: une valeur énumérée a, par défaut, la taille d'un int...

    C'est à dire que, malgré tout ce qui est indiqué, MyCharClass::value et MyShortClass::value ont quoi qu'il arrive la taille d'un int

    Là où cela changerait, c'est si tu définis un trait pour les long ou les long long, et, effectivement, il ne passeraient alors pas avec boost sans avoir défini BOOST_NO_INCLASS_MEMBER_INITIALIZATION
    Sauf qu'en général, le code ressemble plus à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template <char c>
    struct MyCharClass
    {
        public:
            enum{value =c};
            typedef char value_type;
    };
    //etc.
    template <template <class> class Trait>struct toto
    {
        BOOST_STATIC_CONSTANT(toto::value_type, typename Trait::value);
    };
    Soit dit en passant, je ne suis pas sur que BOOST_STATIC_CONSTANT fasse partie de l'interface de Boost. Je n'ai pas creusé mais il me semble que c'est 'juste' une macro interne.
    Si j'ai bien compris la réponse de Laurent: quand c'est possible, Boost utilise le type plutôt que l'enum pour contraindre le sus-dit type ... alors qu'en général, on s'en fiche

  5. #25
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    @screetch, ça m'est revenu à midi, et 3Darchi y'a pensez avant moi, mais il faut notez que cette macro est situé dans boost/config ie réservé à l'interface utilisé par les développeurs de bibliothèques de boost, ce n'est pas pour l'end-user. Donc pour des gens qui sont au courant de ce que représente les macros et les différents workaround des compilos.
    Un code d'end-user n'a pas à se servir de ce genre de fichier.


    @koala : même réponse que 3Darchi.. (décidément).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

Discussions similaires

  1. enum et static const
    Par oodini dans le forum Langage
    Réponses: 9
    Dernier message: 06/09/2011, 09h19
  2. rendre static const un attribut hérité ?
    Par JujuTh dans le forum C++
    Réponses: 6
    Dernier message: 08/07/2007, 16h02
  3. Réponses: 2
    Dernier message: 30/10/2006, 16h40
  4. Réponses: 1
    Dernier message: 23/09/2006, 00h41
  5. static const et taille de tableau
    Par tut dans le forum C++
    Réponses: 3
    Dernier message: 27/01/2005, 16h01

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