Voici une situation typique de notre base de code.scanf() avec C++ enums
enum ConfigOption { CONFIG_1=1, CONFIG_2=2, CONFIG_3=3 }
ConfigOption cfg1, cfg2;
sscanf(s, "%d", &cfg1);
Ceci est un logiciel de simulation utilisé en interne. Non distribué La facilité de maintenance et la correction sont importantes. Portabilité et interface utilisateur - pas vraiment. Le problème est enum
en C++ n'est pas nécessairement int
. Nous obtenons donc un avertissement du compilateur, et peut obtenir un comportement incorrect lors de l'utilisation d'un compilateur différent ou lorsque les optimisations sont activées. Une solution consiste simplement à lancer &cfg
à int*
. Cependant, ceci n'attrapera pas les cas où le compilateur a décidé d'allouer autre chose que int
au enum
.
Je suggère la solution suivante:
template<typename T> inline
int& eint(T& enum_var) {
assert(sizeof(T) == sizeof(int));
return (int&)enum_var;
}
Et maintenant, on utilise scanf
comme suit:
sscanf(s, "%d", &eint(cfg1));
J'aimerais entendre des opinions et d'autres solutions (mieux) au problème ci-dessus. Gardez à l'esprit que l'un des objectifs est de garder le code simple. Ce n'est pas de la «qualité de production» et plus vous ajoutez, plus la maintenance devient difficile.
Depuis la 'sizeof (T) est évalué' Au moment de la compilation, je suggérerais une assertion statique (à la compilation) (par exemple 'BOOST_STATIC_ASSERT'), donc vous obtiendrez une erreur * compilateur * si la taille n'est pas correcte. Et si vous le faites, vous pouvez trouver l'énumération incriminée, et la corriger en utilisant la suggestion de Nils ci-dessous. – UncleBens