Форум программистов, компьютерный форум CyberForum.ru

Как выделить подгруппу в enum? - C++

Восстановить пароль Регистрация
 
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,233
24.11.2016, 01:17     Как выделить подгруппу в enum? #1
Добрый вечер,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
enum class Units
{
    WARIOR_LIGHT,
    WARRIOR_HEAVY,
 
    ARCHER_A,
    ARCHER_B,
    ARCHER_C,
 
    HORSE_A,
    HORSE_B
};
 
int main()
{
    
}
Как в общем enum`e фабрики выделить подгруппу и работать с ней? Поиск входит ли Unit значение в эту под группы, вызывать ряд методов для группы и т.д.

У меня с идей:
- костыльный ARCHER_START, ARCHER_END (плохой тон)
- дополнительная мапа индексации ( нужно менять будет постоянно и там и тут)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2016, 01:17     Как выделить подгруппу в enum?
Посмотрите здесь:

Как найти enum значения в ассемблере C++ Linux
C++ Как работать с типом enum?
Что такое enum и как им пользоваться C++
Как вытащить значение с enum? C++
Как правильно работать с enum в классе? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IchimaruGin
59 / 59 / 22
Регистрация: 14.07.2013
Сообщений: 282
Завершенные тесты: 1
24.11.2016, 02:30     Как выделить подгруппу в enum? #2
как насчет проверки значения если переменная типа Units допустим называется warrior: warrior >= ARCHER_A && warrior <= ARCHER_C тогда warrior принадлежит второй группе
или это и имеется ввиду под
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
- костыльный ARCHER_START, ARCHER_END (плохой тон)
по крайней мере в случае когда значения автоматически присваиваются значениям констант то оно работает нормально, а если самому присваивать значения то нужно быть осторожным...
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,233
24.11.2016, 13:42  [ТС]     Как выделить подгруппу в enum? #3
IchimaruGin, вы мне предлагаете решение, и предложением после утверждаете, что решение не идеальное и легко может быть испорчено без вывода ошибки об этом? Не надо так)
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
24.11.2016, 17:24     Как выделить подгруппу в enum? #4
скорее всего само верное решение будет, выделить отдельные списки с группами, и заполнить их соответственно
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
25.11.2016, 18:21     Как выделить подгруппу в enum? #5
Могу предложить ещё идею: магия шаблонов. Создаём, к примеру, шаблон функции, параметризованный списком значений. Пусть возвращает принадлежность аргумента этому списку. Нечто вроде
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<Units unit0>    // Завершение рекурсии
inline bool belongs(Units unit)
{
    return unit == unit0;
}
 
template<Units unit0, Units unit1, Units ... otherUnits>   // Основной шаблон
inline bool belongs(Units unit)
{
    return unit == unit0 || unit == unit1 || belongs<otherUnits...>(unit);
}
 
 
inline bool isArcher(Units unit)
{
    return belongs<Units::ARCHER_A, Units::ARCHER_B, Units::ARCHER_C>(unit);
}
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,233
26.11.2016, 12:03  [ТС]     Как выделить подгруппу в enum? #6
Nick Alte, интересное решение, но мы упираемся в то, что нужно следить, чтобы новые enum в подгруппу попадали
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
26.11.2016, 15:28     Как выделить подгруппу в enum? #7
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
мы упираемся в то, что нужно следить, чтобы новые enum в подгруппу попадали
Покуда нет у нас в руках полноценной рефлексии, с enum'ами мы всё равно дальше ручных перечислений в рамках языка не уйдём. Разве что забацать какую-нибудь некромантию на макросах, но это как-то не фельтикультяписто и требует соответствующих жертвоприношений.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2016, 15:40     Как выделить подгруппу в enum?
Еще ссылки по теме:

C++ Enum == int !=enum?
Enum или enum class и где его располагать C++ Builder
Работа с enum, как вывести значение C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
26.11.2016, 15:40     Как выделить подгруппу в enum? #8
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
костыльный ARCHER_START, ARCHER_END (плохой тон)
Чем же он плох? Думается, это единственный метод, когда простое действие выполняется простым образом, без разведения кучи соплей на ровном месте

Добавлено через 2 минуты
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
дополнительная мапа индексации ( нужно менять будет постоянно и там и тут)
Использовать или не использовать такой метод, сильно зависит от задачи, а вот насчёт "там и тут" - есть для этого технический приём Технический приём для формирования согласованных данных
Yandex
Объявления
26.11.2016, 15:40     Как выделить подгруппу в enum?
Ответ Создать тему
Опции темы

Текущее время: 00:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru