Понятное дело, что в рантайме у нас нет возможности определить, входит ли значение переменной в enum, поскольку никакого enum'а в рантайме нет. Но вот есть такая вещь, по структуре напоминающая дерево:
A
+-A1
+-A2
+-A3
|
B
+-B1
+-B2
|
C
+-C1
+-C2
+-C3
+-C4
+-C5
В enum я это записал в виде значений с масками. Для A маска 0x00010000, для B 0x00020000 и т.д. Получилось как-то так:
enum XXX
{
//A
E_A1 = (0x00010001U), //+-A1
E_A2 = (0x00010002U), //+-A2
E_A3 = (0x00010003U), //+-A3
//|
//B
E_B1 = (0x00020001U), //+-B1
E_B2 = (0x00020002U), //+-B2
//|
//C
E_C1 = (0x00030001U), //+-C1
E_C2 = (0x00030002U), //+-C2
E_C3 = (0x00030003U), //+-C3
E_C4 = (0x00030004U), //+-C4
}
Я знаю такой не самый оптимальный метод: завести множесто мелких enum'ов для подтипов и один enum для перечисления типов. В каждом сделать последним значением что-то типа *_COUNT или *_MAX и оставить с автонумерацией. Тогда в чтении с файла мне нжен большой switch по типу, потом расписывать проверки на принадлежность к каждом подтипу (то самое сравнение с *_COUNT/*_MAX)... Но это выглядит очень костыльным с точки зрения добавления новых типов/подтипов).
Как бы вы это решили?