[VC][trick] проверка enum
От: superlexx  
Дата: 26.11.09 20:37
Оценка: 128 (10) +1
Если хочется проверить, совпадает ли значение некоего 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.
Re: [VC][trick] проверка enum
От: ioni Россия  
Дата: 29.11.09 15:19
Оценка:
S>bool IsEValid (const E value)
S>{
S> return value == v0 || value == v1;
S>}[/ccode]
с такого рода проверкой все ясно...

> Неудобно, что нужно не забывать синхронизировать enum c функцией.


у нас обычно для этого используют BOOST_STATIC_ASSERT или другой похожий аналог
Re: [VC][trick] проверка enum
От: Кодт Россия  
Дата: 29.11.09 19:27
Оценка:
Здравствуйте, superlexx, Вы писали:

S>#pragma warning (error: 4062)

Очень правильный и полезный варнинг!
Перекуём баги на фичи!
Re[2]: [VC][trick] проверка enum
От: superlexx  
Дата: 29.11.09 20:36
Оценка:
Здравствуйте, ioni, Вы писали:

I>у нас обычно для этого используют static_assert


Интересно, а как это в моём примере спасает от добавления
v0_and_a_half = 128,
?
Re: [VC][trick] проверка enum
От: TimurSPB Интернет  
Дата: 29.11.09 22:48
Оценка:
Здравствуйте, 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?
Make flame.politics Great Again!
Re[3]: [VC][trick] проверка enum
От: ioni Россия  
Дата: 30.11.09 06:17
Оценка:
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);
....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.