Страницы

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

четверг, 13 февраля 2020 г.

Получить значение по индексу в enum

#cpp


Собственно есть enum:

enum DECK_COUNT {
    DECK_X1 = 1, DECK_X2 = DECK_X1 << 1, DECK_X3 = DECK_X2 << 1, DECK_X4 =
        DECK_X3 << 1
};


Есть ли возможность без лишних заморочек получить значение из перечисления по индексу?
    


Ответы

Ответ 1



Добавьте enum'ы START и END - вот вам и индекс и границы цикла. Так делали в далёком прошлом. И используйте enum class, enum - это пережитки прошлого. enum class eShipType { START, DESK_1, DESK_2, DESK_3, DESK_4, END, }; eShipType getShipByIndex(const size_t index) { return (index >= static_cast(eShipType::START) && index <= static_cast(eShipType::END)) ? static_cast(static_cast(eShipType::START) + index) : throw ExpectionOutOfRange("eShipType with index " +std::to_string(index) ); } Update: так же отмечу, что случаи когда enum'у нужны явные значения очень очень редко - и как вы уже догодались типы кораблей для игры морской бой - не тот случай.

Ответ 2



Вы не можете перегрузить оператор индексирования для перечислений, так как этот оператор должен быть членом класса. Но вы можете написать обычную функцию, которая возвращает нужный вам перечислитель. Например, #include enum DECK_COUNT { DECK_X1 = 1, DECK_X2 = DECK_X1 << 1, DECK_X3 = DECK_X2 << 1, DECK_X4 = DECK_X3 << 1 }; DECK_COUNT getDeck( size_t i ) { i %= 4; return static_cast( 1 << i ); } int main() { for ( size_t i = 0; i < 4; i++ ) std::cout << getDeck( i ) << std::endl; return 0; } Ее вывод на консоль 1 2 4 8

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

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