Помимо исключений, которые были бы предпочтительным решением во время выполнения (и будут обрабатывать сумасшедшие преобразования), я также склонен использовать статические утверждения времени компиляции.
Вы можете сделать следующее:
//this fails at compile time when the parameter to the template is false at compile time, Boost should provide a similar facility
template <COLboolean IsFalse> struct STATIC_ASSERTION_FAILURE;
template <> struct STATIC_ASSERTION_FAILURE<true>{};
#define STATIC_ASSERT( CONDITION_ ) sizeof( STATIC_ASSERTION_FAILURE< (COLboolean)(CONDITION_) > );
//
// this define will break at compile time at locations where a switch is being
// made for the enum. This helps when adding enums
//
// the max number here should be updated when a new enum is added.
//
// When a new enum is added, at the point of the switch (where this
// define is being used), update the switch statement, then update
// the value being passed into the define.
//
#define ENUM_SWITCH_ASSERT( _MAX_VALUE )\
STATIC_ASSERT( _MAX_VALUE == Enum_Two)
enum Enum
{
Enum_One = 0,
Enum_Two = 1
};
Затем в вашем коде всякий раз, когда вы используете набор перечислений:
ENUM_SWITCH_ASSERT( Enum_Two )
switch( e )
{
case Enum_One:
do_one();
break;
case Enum_Two:
do_two();
break;
}
Теперь, когда вы изменяете макрос ENUM_SWITCH_ASSERT для обработки нового значения перечисления, он прерывается во время компиляции рядом с местами, которые используют набор перечислений. Помогает много при добавлении новых случаев.