Информация об изменениях

Сообщение Re: Вот еще бесит отсутствие флагового типа от 08.09.2022 19:39

Изменено 08.09.2022 19:46 Sm0ke

Re: Вот еще бесит отсутствие флагового типа
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!


M>Как-то не продумано это. А используется везде и постоянно. За неимением флагов народ использует enum, а в новых плюсиках — enum class, но это же костыли.


M>Хочется типизированного флагового типа, хз, какое ключевое слово к нему прилепить, может enum class flags bla-bla


M>Пока обхожусь разными вариантами, в основном enum/enum class, или что-то типа такого:

M>
template<typename UnderlayingType>
M>struct Flags
M>{
M>    typedef UnderlayingType underlaying_type;

M>    static const UnderlayingType v1 = x1;
M>    //...

M>    // Тут конструкторы и преобразователи в UnderlayingType

M>    // Можно брать значение, как мембер с именем value
M>    underlaying_type value;

M>};


M>А как вы решаете флаговою проблему?


Если я вас правильно понял вы хотите аналог bitset из MySQL.

Я делаю как-то так:
using flags_raw = std::uintmax_t;

enum flags : flags_raw {
    flag_allow_plain    = 1 << 0,
    flag_was_refers        = 1 << 1,
    flag_was_extends    = 1 << 2,
    flag_was_fn_params    = 1 << 3,
    flag_was_colon        = 1 << 4,
};

int main() {
    flags_raw fl = flag_allow_plain | flag_was_colon; // храню в underlying
    return 0;
}

Ограничения на 64 флага пока хватает.
Re: Вот еще бесит отсутствие флагового типа
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!


M>Как-то не продумано это. А используется везде и постоянно. За неимением флагов народ использует enum, а в новых плюсиках — enum class, но это же костыли.


M>Хочется типизированного флагового типа, хз, какое ключевое слово к нему прилепить, может enum class flags bla-bla


M>Пока обхожусь разными вариантами, в основном enum/enum class, или что-то типа такого:

M>
template<typename UnderlayingType>
M>struct Flags
M>{
M>    typedef UnderlayingType underlaying_type;

M>    static const UnderlayingType v1 = x1;
M>    //...

M>    // Тут конструкторы и преобразователи в UnderlayingType

M>    // Можно брать значение, как мембер с именем value
M>    underlaying_type value;

M>};


M>А как вы решаете флаговою проблему?


Если я вас правильно понял вы хотите аналог set из MySQL. https://dev.mysql.com/doc/refman/8.0/en/set.html

Я делаю как-то так:
using flags_raw = std::uintmax_t;

enum flags : flags_raw {
    flag_allow_plain    = 1 << 0,
    flag_was_refers        = 1 << 1,
    flag_was_extends    = 1 << 2,
    flag_was_fn_params    = 1 << 3,
    flag_was_colon        = 1 << 4,
};

int main() {
    flags_raw fl = flag_allow_plain | flag_was_colon; // храню в underlying
    return 0;
}

Ограничения на 64 флага пока хватает.