170 похожих чатов

Вот вопрос, существует ли какой-то тайный хитрый способ проверить есть

ли соответствие внутри enum для произвольного числа, не делая switch по всем элементам? Ну, типа такого:


if ( std::is_in_enum<Enum>(val) )
....



Я знаю как написать костыли, если элементы в Enum идут по порядку, знаю как нагородить макросов для генерации таких функций, но может я что-то пропустил и появились более стандартные способы в С++20?

А если нет, то может кто знает компиляторо-зависимые расширения для этих проверок?

12 ответов

20 просмотров

если не против грубой силы: https://github.com/Neargye/magic_enum .Полагаю ваш случай это enum_contains

Pavel-Zhigulin Автор вопроса
Alexey Murin
если не против грубой силы: https://github.com/Nea...

Спасибо за ссылку, но опять же, это не общий случай. Заглянув в код, стало понятно, что по умолчанию весь enum должен быть в диапазоне -128, 128, а чтобы можно было использовать значения больше, нужно уже макросы MAGIC_ENUM_RANGE_MIN и MAGIC_ENUM_RANGE_MAX переопределять. К тому же, там опять же в сущности тупой перебор по всем значениям от RANGE_MIN до RANGE_MAX идёт и выполняется SFINAE подстановка для каждого :) Я боюсь представить, сколько это будет компилироваться, как только у меня появится enum с флагом хотя бы 0x00008000. Опять же, судя по коду максимальный размер, который в целом может быть - это INT16_MAX. Если коротко - мне существенно проще использовать набор макросов для генерации соответствующих вещей, чем эту либу :)

Можно, через magic_enum

Pavel-Zhigulin Автор вопроса
Kirill Bolshakov
Можно, через magic_enum

Вот я только что прокомментировал этот момент, буквально на один комментарий выше :)

Pavel Zhigulin
Вот я только что прокомментировал этот момент, бук...

Относительно просто рядом кодген прогнать, что работает сильно надежнее подобных хаков

Pavel Zhigulin
Спасибо за ссылку, но опять же, это не общий случа...

Сочувствую если вы руками делаете емуны больше 128. Для флагов в библиотеке, как раз есть отдельный перебор, который прокроет все флаги

Pavel-Zhigulin Автор вопроса
Daniil Goncharov
Сочувствую если вы руками делаете емуны больше 128...

Там не по количеству элементов проверяется, а по максимальному значению. Т.е. для enum-а с одним значением, вроде: enum class X { COLOR_RED = 0x00FF0000 } Оно просто не будет работать (не скомпилируется).

Pavel Zhigulin
Там не по количеству элементов проверяется, а по м...

Ну да, для таких особых случаев плохо подходит Дизайн библиотеки для мелких обычных енумов

Pavel-Zhigulin Автор вопроса
Daniil Goncharov
Ну да, для таких особых случаев плохо подходит Диз...

Я признаться надеялся на ответ в стиле: "хей, да давно уже build_in функции компиляторы себе завезли, вот смотри" :) :) Понятное дело, что разного рода костыли для тех или иных случаев я могу сам написать :) Мне хотелось какое-нибудь общее решение проблемы :)

Pavel-Zhigulin Автор вопроса
Daniil Goncharov
Все ждут рефлексию

Ну, я понимаю, что все ждут :) Просто у компилятора есть вообще всё, чтобы сгенерировать такие проверки автоматически. Статическая рефлексия в общем случае я полагаю сложнее в реализации да нужна довольно редко, если подумать. А вот эта канитель с enum-ами тянется с бородатых времен и люди уже 40 лет кодогенерируют :)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта