Сообщение 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>
M>А как вы решаете флаговою проблему?
Если я вас правильно понял вы хотите аналог bitset из MySQL.
Я делаю как-то так:
Ограничения на 64 флага пока хватает.
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>
M>А как вы решаете флаговою проблему?
Если я вас правильно понял вы хотите аналог set из MySQL. https://dev.mysql.com/doc/refman/8.0/en/set.html
Я делаю как-то так:
Ограничения на 64 флага пока хватает.
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 флага пока хватает.