Если хочется проверить, совпадает ли значение некоего enum с одним из именованных значений, до сих пор использовалась соответствующая функция:
enum E
{
v0 = 42,
v1 = 4711
};
bool IsEValid (const E value)
{
return value == v0 || value == v1;
}
Неудобно, что нужно не забывать синхронизировать enum c функцией. На помощь приходит
C4062:
// enumerator 'x' in switch of enum 'y' is not handled
#pragma warning (error: 4062)
bool IsEValidSynchronized (const E value)
{
switch (value)
{
case v0:
case v1:
return true;
}
return false;
}
, и теперь добавление или удаление нового именованного значения E приводит к ошибке компиляции, пока не подправлен switch.
Здравствуйте, ioni, Вы писали:
I>у нас обычно для этого используют static_assert
Интересно, а как это в моём примере спасает от добавления
v0_and_a_half = 128,
?
Здравствуйте, superlexx, Вы писали:
S>Если хочется проверить, совпадает ли значение некоего enum с одним из именованных значений, до сих пор использовалась соответствующая функция:enum E
S>{
S> v0 = 42,
S> v1 = 4711
S>};
S>bool IsEValid (const E value)
S>{
S> return value == v0 || value == v1;
S>}
Неудобно, что нужно не забывать синхронизировать enum c функцией. На помощь приходит C4062:// enumerator 'x' in switch of enum 'y' is not handled
S>#pragma warning (error: 4062)
S>bool IsEValidSynchronized (const E value)
S>{
S> switch (value)
S> {
S> case v0:
S> case v1:
S> return true;
S> }
S> return false;
S>}
, и теперь добавление или удаление нового именованного значения E приводит к ошибке компиляции, пока не подправлен switch.
А в gcc?
S>Интересно, а как это в моём примере спасает от добавления v0_and_a_half = 128,
?
воркэроунд примерно следующий
enum test
{
value_1,
value_2,
v0_and_a_half = 128,
value_numbers = 2
};
....
BOOST_STATIC_ASSERT(value_numbers == 2);
....