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 :

méta-programmation : static ou enum pour stocker une valeur


Sujet :

C++

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 104
    Points : 614
    Points
    614
    Par défaut méta-programmation : static ou enum pour stocker une valeur
    Bonjour,

    J'ai parfois vu l'utilisation d'un type enum pour stocker une valeur dans le cadre de la méta-programmation et je me demandais pourquoi utiliser cela plutôt qu'une constante membre statique du type de la donnée.

    Dans l'exemple ci-dessous, val_enum et val_static servent tous les deux à stocker une valeur. Le premier utilise pour cela une énumération tandis que l'autre utilise une constante statique. Je ne vois que deux différences en pratique. D'une part, le compilateur m'affiche des avertissements lorsque je compare les valeurs énumérées. D'autre part, je me dis que les membres statiques peuvent éventuellement consommer un peu de mémoire dans le programme compilé, sinon je ne pourrais y faire référence comme à la fin du main() ci-dessous.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include <iostream>
     
    template<int N>
    struct val_enum
    {
      typedef int value_type;
     
      enum
        {
          value = N
        };
    };
     
    template<int N>
    struct val_static
    {
      typedef int value_type;
     
      static const int value = N;
    };
     
    template<typename Val1, typename Val2>
    struct max_value
    {
      enum
        {
          value_enum = (Val1::value > Val2::value) ? Val1::value : Val2::value
        };
     
      static const typename Val1::value_type value_static =
        (Val1::value > Val2::value) ? Val1::value : Val2::value;
    };
     
    int main()
    {
      std::cout << max_value< val_enum<3>, val_enum<5> >::value_enum << std::endl;
      std::cout << max_value< val_static<5>, val_static<3> >::value_enum << std::endl;
     
      std::cout << max_value< val_enum<3>, val_enum<5> >::value_static << std::endl;
      std::cout << max_value< val_static<5>, val_static<3> >::value_static << std::endl;
     
      const int& a = val_static<1>::value;
      std::cout << a << std::endl;
     
      return 0;
    }
    Mes questions sont donc : dans quels cas faut-il préférer l'énumération à la variable membre statique*? et dans quels cas les constantes membres statiques consomment de la mémoire*?

  2. #2
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Désolé, je ne maitrise que très peu la méta-prog, mais je peux répondre à ta dernière question :

    Tout le temps. Là ou un enum peut être remplacé par un #define (en un peu mieux car il à un type), une variable static est présente en mémoire sous son nom. Généralement, si elle est constante, elle est stocké dans le segment de code. Donc cela alourdie ton executable. S'il s'agit d'une dll critique, c'est pas glop. Sinon, c'est peut être pas super important.

    Après, je dirai que en méta-prog j'ai plus souvent vu des enum. Mais c'est peut-être un hasard.

    Ensuite, je dirai qu'avec les enum structuré de c++0x, la balance devrait pesait définitivement en faveur des enums... Mais là, je m'avance beaucoup au vue de ma maitrise du sujet >< !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  3. #3
    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
    Bonjour,
    Citation Envoyé par j-jorge Voir le message
    Mes questions sont donc : dans quels cas faut-il préférer l'énumération à la variable membre statique*? et dans quels cas les constantes membres statiques consomment de la mémoire*?
    Certains (vieux) compilateurs ne supportaient pas l'initialisation en ligne de variable static constante entière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct toto{
       static const int valeur=0; // certains compilo rejettent cette ligne
    }
    C'est pour ça que parfois on trouve un enum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct toto{
       enum{ valeur=0}; // tjrs OK
    }
    Cela a récemment été abordé : [Metaprog] static const vs enum

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 104
    Points : 614
    Points
    614
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Cela a récemment été abordé : [Metaprog] static const vs enum
    Ça m'apprendra à chercher sur le forum

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/06/2008, 17h10
  2. Réponses: 2
    Dernier message: 10/04/2008, 11h48
  3. [DOM] <![CDATA[ ]]> pour stocker une image
    Par Invité dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 18/11/2006, 05h46
  4. [T-SQL] une colonne pour stocker différentes valeurs
    Par kakid dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/06/2006, 18h40
  5. [Image] Classe pour stocker une image JPEG ?
    Par elitost dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 19/01/2006, 13h34

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