Сообщение Re: Вот еще бесит отсутствие флагового типа от 30.09.2022 16:48
Изменено 30.09.2022 16:58 Marty
Re: Вот еще бесит отсутствие флагового типа
Здравствуйте, Marty, Вы писали:
В общем, покопал я немножко инет на тему флагов, проблема, как оказалось, зудит не только у меня.
Накопал, что C++ сейчас гарантирует, что все возможные битовые комбинации значений enum'а влезут в underlying тип (если не задан явно). Похоже, что это таки подготовка к тому, чтобы из enum'а сделать флаговый тип просто каким-нибудь атрибутов, или ещё как. Но C++29 или 32, в котором это таки будет реализовано, мне ждать неохота, поэтому я накидал свой макросик (вернее, большую часть нагло стырил где-то тут — https://stackoverflow.com/questions/1448396/how-to-use-enums-as-flags-in-c)
Там, кстати, нашел, что оказывается в winnt.h есть подобный макрос, называется DEFINE_ENUM_FLAG_OPERATORS
В общем, у меня такой получился:
Используется как-то так:
Я добавил сдвиг и сравнение (==/!=) с underlying type.
Сдвиг для битовых масок имхо полезен.
Сравнение — чтобы можно было делать что-то типа if ((a&b)==0). Я обычно явно так пишу, но некоторые не пишут, и тут пока есть недоработка — нельзя просто написать if (a&b). Меня особо не парит, но если есть идеи — предлагаю обсудить
В общем, покопал я немножко инет на тему флагов, проблема, как оказалось, зудит не только у меня.
Накопал, что C++ сейчас гарантирует, что все возможные битовые комбинации значений enum'а влезут в underlying тип (если не задан явно). Похоже, что это таки подготовка к тому, чтобы из enum'а сделать флаговый тип просто каким-нибудь атрибутов, или ещё как. Но C++29 или 32, в котором это таки будет реализовано, мне ждать неохота, поэтому я накидал свой макросик (вернее, большую часть нагло стырил где-то тут — https://stackoverflow.com/questions/1448396/how-to-use-enums-as-flags-in-c)
Там, кстати, нашел, что оказывается в winnt.h есть подобный макрос, называется DEFINE_ENUM_FLAG_OPERATORS
В общем, у меня такой получился:
Скрытый текст | |
| |
Используется как-то так:
Скрытый текст | |
| |
Я добавил сдвиг и сравнение (==/!=) с underlying type.
Сдвиг для битовых масок имхо полезен.
Сравнение — чтобы можно было делать что-то типа if ((a&b)==0). Я обычно явно так пишу, но некоторые не пишут, и тут пока есть недоработка — нельзя просто написать if (a&b). Меня особо не парит, но если есть идеи — предлагаю обсудить
Re: Вот еще бесит отсутствие флагового типа
Здравствуйте, Marty, Вы писали:
В общем, покопал я немножко инет на тему флагов, проблема, как оказалось, зудит не только у меня.
Накопал, что C++ сейчас гарантирует, что все возможные битовые комбинации значений enum'а влезут в underlying тип (если не задан явно). Похоже, что это таки подготовка к тому, чтобы из enum'а сделать флаговый тип просто каким-нибудь атрибутов, или ещё как. Но C++29 или 32, в котором это таки будет реализовано, мне ждать неохота, поэтому я накидал свой макросик (вернее, большую часть нагло стырил где-то тут — https://stackoverflow.com/questions/1448396/how-to-use-enums-as-flags-in-c)
Там, кстати, нашел, что оказывается в winnt.h есть подобный макрос, называется DEFINE_ENUM_FLAG_OPERATORS
В общем, у меня такой получился:
Используется как-то так:
Я добавил сдвиг и сравнение (==/!=) с underlying type.
Сдвиг для битовых масок имхо полезен.
Сравнение — чтобы можно было делать что-то типа if ((a&b)==0). Я обычно явно так пишу, но некоторые не пишут, и тут пока есть недоработка — нельзя просто написать if (a&b). Меня особо не парит, но если есть идеи — предлагаю обсудить
ЗЫ Кому надо — лежит тут — https://github.com/al-martyn1/marty_cpp
В общем, покопал я немножко инет на тему флагов, проблема, как оказалось, зудит не только у меня.
Накопал, что C++ сейчас гарантирует, что все возможные битовые комбинации значений enum'а влезут в underlying тип (если не задан явно). Похоже, что это таки подготовка к тому, чтобы из enum'а сделать флаговый тип просто каким-нибудь атрибутов, или ещё как. Но C++29 или 32, в котором это таки будет реализовано, мне ждать неохота, поэтому я накидал свой макросик (вернее, большую часть нагло стырил где-то тут — https://stackoverflow.com/questions/1448396/how-to-use-enums-as-flags-in-c)
Там, кстати, нашел, что оказывается в winnt.h есть подобный макрос, называется DEFINE_ENUM_FLAG_OPERATORS
В общем, у меня такой получился:
Скрытый текст | |
| |
Используется как-то так:
Скрытый текст | |
| |
Я добавил сдвиг и сравнение (==/!=) с underlying type.
Сдвиг для битовых масок имхо полезен.
Сравнение — чтобы можно было делать что-то типа if ((a&b)==0). Я обычно явно так пишу, но некоторые не пишут, и тут пока есть недоработка — нельзя просто написать if (a&b). Меня особо не парит, но если есть идеи — предлагаю обсудить
ЗЫ Кому надо — лежит тут — https://github.com/al-martyn1/marty_cpp