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

Сообщение Re[2]: Вот еще бесит отсутствие флагового типа от 08.09.2022 15:41

Изменено 08.09.2022 15:43 Андрей Тарасевич

Re[2]: Вот еще бесит отсутствие флагового типа
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, Marty, Вы писали:


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


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


SVZ>Непонятно:

SVZ>1. Что именно ты подразумеваешь под "флагом"
SVZ>2. Какую задачу хочешь решить.

SVZ>
bool theFlag;

SVZ>struct Flagzz
SVZ>{
SVZ>  unsigned int flagA:1;
SVZ>  unsigned int flagB:1;
SVZ>}
SVZ>


SVZ>Вполне себе флаги и существуют давно.


Это — слишком ограниченная реализация набора флагов, ибо она не поддерживает run-time адресации флагов. Это настолько серьезное ограничение ограниченная, что такая реализация бесполезна и никому не нужна.

Любая реализация набора флагов должна поддерживать операции вроде "проверить, выставлен ли хотя бы один флаг по маске", "сбросить все флаги по маске" и т.п. для run-time маски.

Реализация набора флагов через битовые поля — антипаттерн, который в какой-то момент обязательно приведет к необходимости переделки кода: выкашиванию битовых полей и использованию целочисленного типа вместо них.
Re[2]: Вот еще бесит отсутствие флагового типа
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, Marty, Вы писали:


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


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


SVZ>Непонятно:

SVZ>1. Что именно ты подразумеваешь под "флагом"
SVZ>2. Какую задачу хочешь решить.

SVZ>
bool theFlag;

SVZ>struct Flagzz
SVZ>{
SVZ>  unsigned int flagA:1;
SVZ>  unsigned int flagB:1;
SVZ>}
SVZ>


SVZ>Вполне себе флаги и существуют давно.


Это — слишком ограниченная реализация набора флагов, ибо она не поддерживает run-time адресации флагов. Это настолько серьезное ограничение, что такая реализация практически бесполезна.

Любая реализация набора флагов должна поддерживать операции вроде "проверить, выставлен ли хотя бы один флаг по маске", "сбросить все флаги по маске" и т.п. для run-time маски. По этой причине флаги всегда сразу вручную пакуют в целочисленный тип. Реализация набора флагов через битовые поля — антипаттерн, который в какой-то момент обязательно приведет к необходимости переделки кода: выкашиванию битовых полей и использованию целочисленного типа вместо них.