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*?