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

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

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


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



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

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

12 ответов

18 просмотров

если не против грубой силы: 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 лет кодогенерируют :)

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

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

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта