Страницы

Поиск по вопросам

среда, 17 апреля 2019 г.

Правильная проверка обычной переменной на вхождение в enum.

Доброго времени суток. Ситуация следующая, с сервера приходит пакет, в определённом поле которого есть байт, который я хочу передавать в метод как член определённого enum’а. Для приведения я использую статик каст, но я задумался о том, что будет, если сервер пришлёт мне некорректные данные и значение в этом байте окажется за пределами enum’а. Накидал тестовый код и как оказалось С++ спокойно это проглотит и не чего не бросит (.
enum class MyEnum { Red = 1, Black = 2, White = 3 }; void Foo(MyEnum val) { std::cout << static_cast(val) << std::endl; };
int main() { Foo(MyEnum::Red); Foo(static_cast(3)); Foo(static_cast(5)); system("PAUSE"); return 0; }
Есть ли какие-то стандартные средства эффективно (с точки зрения производительности) проверить вхождение значения в конкретный enum и дать мне возможность бросит исключение. Если их нет, то как это сделать, не перелопачивая весь enum руками. И можно ли как то сделать foreach обход enuma не городя огород (что то типа for (auto i : MyEnum) ...)?
p.s. С++ 14 компилятор GCC 6.3.


Ответ

Я тут для вас кое что сооброзил, не знаю насколько поможет. Вам придется просто после добавления в перечислении, добавлять и в оператор ++
#include #include using namespace std; enum class Some { min, s1 = 3, s2 = 5, s3 = 7, max = 9, end = 100 }; Some& operator++(Some& s) { switch(s) { case Some::min: return s = Some::s1; case Some::s1: return s = Some::s2; case Some::s2: return s = Some::s3; case Some::s3: return s = Some::max; case Some::max: s = Some::end; } return s; }
int main() { int n = 5, index; Some t = Some::min; while (int(t) != n && t != Some::end) { ++t; ++index; } if (t == Some::end) cout << "indefined" ; else cout << index; // выдаст 2
return 0; }
Ну можно это все проделать в какой то функции, или на основе этого создавать класс - итератор. Тут index будет иметь значение как индекс в векторах...

Комментариев нет:

Отправить комментарий