-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Автоматические BitmaskType для scoped enum #569
Comments
Проблема в том, что атрибуты - опциональны. Тут нужен кейворд, или что-то подобное |
Ok, пусть будет например |
А может лучше |
Ну так то можно это всё и в макрос завернуть, но лучший код тот которого нет. С теми же default всё равно же придется расписать &,|,^,~. А с contextual bool conversion вообще никак не решить вручную. Ну и компиляторам легче, не нужно вообще ничего искать, сам тип содержит информацию о возможности битовых операций. |
Добавить маркер
bitmask
для scoped enum.В стандарте есть различные scoped enum удовлетворяющие требованиям BitmaskType.
Но реализация этих требований выливается в большое количество boilerplate кода.
Примеры:
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/fs_fwd.h#L165
https://github.com/microsoft/STL/blob/ed8150e099f6124c50dd4f002cd2ab8c429a81e3/stl/inc/type_traits#L2270
Предлагается переложить эту работу на компилятор, явно указав допустимость выполненения битовых операций со значениями enum.
Во избежание добавления новых ключевых слов можно расширить enum-key.
Сейчас это one of enum, enum class, or enum struct, добавить enum union
При этом предполагается что операции вида
Enum::x <op> Enum::y
будут эквивалентны следующему коду:Вторая проблема с использованием scoped enum в качестве bitmask это проверки на 0.
Пример из gcc:
Предлагается для значений bitmask enum использовать правила explicit bool conversion аналогичные таковым для соотвествующих underlying type.
Дополнительно можно добавить concept Bitmask и функцию проверки
The text was updated successfully, but these errors were encountered: