[Metaprog] static const vs enum
Salut à tous,
Jme pose une question, c'est plus une histoire de style qu'autre chose mais bon allons y, quand on travaille en compile-time (metaprog etc) on a besoin de compile-time constant (aucune traduction fr me plait), pour ça on a deux choses soit enum soit static const.
Jusque là j'ai toujours préféré les enum, d'un parce que je l'ai plus souvent vu, que je suis plus à l'aise (visuellement parlant) avec, de deux parce que seul l'enum est une vraie constante de compilation. Dans le cas d'un static const y'aura une allocation au run tim, donc histoire d'être purement compile-time => enum. (c'est pas de moi, c'est du C++ template the complete guide).
J'ai toujours vu boost utilisé une macro : BOOST_STATIC_CONSTANT(type, value);
Jusqu'à ce que je sois curieux et que je me demande ce qu'il y'a derrière cette macro, un grep plus tard (c'est dans boost/config/suffix.hpp) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
// BOOST_STATIC_CONSTANT workaround --------------------------------------- //
// On compilers which don't allow in-class initialization of static integral
// constant members, we must use enums as a workaround if we want the constants
// to be available at compile-time. This macro gives us a convenient way to
// declare such constants.
# ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
# define BOOST_STATIC_CONSTANT(type, assignment) enum { assignment }
# else
# define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment
# endif |
Donc dans le cas général ils préférent (?) utiliser un static const. Y'a-t-il une raison ou c'est purement et simplement une convention qu'ils ont pris?
Attention, c'est pas parce que boost fait comme ça que je vais changer ma façon de faire hein, à moins que justement y'ai une bonne raison qui mette un au dessus de l'autre.
Question additionnelle : et vous, où va votre préférence?