ли соответствие внутри enum для произвольного числа, не делая switch по всем элементам? Ну, типа такого:
if ( std::is_in_enum<Enum>(val) )
....
Я знаю как написать костыли, если элементы в Enum идут по порядку, знаю как нагородить макросов для генерации таких функций, но может я что-то пропустил и появились более стандартные способы в С++20?
А если нет, то может кто знает компиляторо-зависимые расширения для этих проверок?
если не против грубой силы: https://github.com/Neargye/magic_enum .Полагаю ваш случай это enum_contains
Спасибо за ссылку, но опять же, это не общий случай. Заглянув в код, стало понятно, что по умолчанию весь enum должен быть в диапазоне -128, 128, а чтобы можно было использовать значения больше, нужно уже макросы MAGIC_ENUM_RANGE_MIN и MAGIC_ENUM_RANGE_MAX переопределять. К тому же, там опять же в сущности тупой перебор по всем значениям от RANGE_MIN до RANGE_MAX идёт и выполняется SFINAE подстановка для каждого :) Я боюсь представить, сколько это будет компилироваться, как только у меня появится enum с флагом хотя бы 0x00008000. Опять же, судя по коду максимальный размер, который в целом может быть - это INT16_MAX. Если коротко - мне существенно проще использовать набор макросов для генерации соответствующих вещей, чем эту либу :)
Можно, через magic_enum
Вот я только что прокомментировал этот момент, буквально на один комментарий выше :)
Относительно просто рядом кодген прогнать, что работает сильно надежнее подобных хаков
Сочувствую если вы руками делаете емуны больше 128. Для флагов в библиотеке, как раз есть отдельный перебор, который прокроет все флаги
Там не по количеству элементов проверяется, а по максимальному значению. Т.е. для enum-а с одним значением, вроде: enum class X { COLOR_RED = 0x00FF0000 } Оно просто не будет работать (не скомпилируется).
Ну да, для таких особых случаев плохо подходит Дизайн библиотеки для мелких обычных енумов
Я признаться надеялся на ответ в стиле: "хей, да давно уже build_in функции компиляторы себе завезли, вот смотри" :) :) Понятное дело, что разного рода костыли для тех или иных случаев я могу сам написать :) Мне хотелось какое-нибудь общее решение проблемы :)
Все ждут рефлексию
Ну, я понимаю, что все ждут :) Просто у компилятора есть вообще всё, чтобы сгенерировать такие проверки автоматически. Статическая рефлексия в общем случае я полагаю сложнее в реализации да нужна довольно редко, если подумать. А вот эта канитель с enum-ами тянется с бородатых времен и люди уже 40 лет кодогенерируют :)
Обсуждают сегодня