Often, one needs several enumerated types together. Sometimes, one has a name clash. Two solutions to this come to mind: use a namespace, or use ‘larger’ enum element names. Still, the namespace solution has two possible implementations: a dummy class with nested enum, or a full blown namespace.
I’m looking for pros and cons of all three approaches.
Example:
// oft seen hand-crafted name clash solution enum eColors { cRed, cColorBlue, cGreen, cYellow, cColorsEnd }; enum eFeelings { cAngry, cFeelingBlue, cHappy, cFeelingsEnd }; void setPenColor( const eColors c ) { switch (c) { default: assert(false); break; case cRed: //... break; case cColorBlue: //... //... } } // (ab)using a class as a namespace class Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; }; class Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; }; void setPenColor( const Colors::e c ) { switch (c) { default: assert(false); break; case Colors::cRed: //... break; case Colors::cBlue: //... //... } } // a real namespace? namespace Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; }; namespace Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; }; void setPenColor( const Colors::e c ) { switch (c) { default: assert(false); break; case Colors::cRed: //... break; case Colors::cBlue: //... //... } }
Original C++03 answer:
The benefit from a
namespace(over aclass) is that you can useusingdeclarations when you want.The problem with using a
namespaceis that namespaces can be expanded elsewhere in the code. In a large project, you would not be guaranteed that two distinct enums don’t both think they are calledeFeelingsFor simpler-looking code, I use a
struct, as you presumably want the contents to be public.If you’re doing any of these practices, you are ahead of the curve and probably don’t need to scrutinize this further.
Newer, C++11 advice:
If you are using C++11 or later,
enum classwill implicitly scope the enum values within the enum’s name.With
enum classyou will lose implicit conversions and comparisons to integer types, but in practice that may help you discover ambiguous or buggy code.