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.
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*?
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; }
Partager