#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
Вы не можете перегрузить оператор индексирования для перечислений, так как этот оператор должен быть членом класса. Но вы можете написать обычную функцию, которая возвращает нужный вам перечислитель. Например, #includeenum 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
Комментариев нет:
Отправить комментарий