Re: [Interest] Flags: Non-intrusive, type-safe bitwise operators for enums

Julien Blanc via Boost <[email protected]>
Newsgroups gmane.comp.lib.boost.devel
Message-ID <[email protected]>
Le mardi 17 mars 2026 à 05:25 +0100, Rainer Deyke via Boost a écrit :
> On 3/16/26 11:59, Tobias Loew via Boost wrote:
> 
> 
> While better support for bit flags based on scoped enums is
> undoubtedly 
> useful, I don't like how verbose the example code is.
> 
> I've considered an alternate solution to the same problem based on a 
> wrapper around std::bitset.
> 
>    template<typename Enum> class enum_bitset {
>    public:
>      auto operator[](Enum idx) {
>        return this->data_store[static_cast<std::size_t>(idx)];
>      }
>      // ...and all of the other member functions...
>    private:
>      std::bitset<...> data_store;
>    };
> 
> This has the advantage of getting rid of all of the ugly 
> boost::flags::nth_bits and boost::flags::anys in the example code:
> 
>    enum class pizza_topping { tomato, cheese, salami, olives, garlic
> };
> 
>    void order_pizza(enum_bitset<pizza_topping> const &toppings) {
>      std::cout << "Pizza ordered with\n";
>      if (toppings[pizza_toppings::tomato]) {
>          std::cout << "- tomato\n";
>      }
>      if (toppings[pizza_toppings::cheese]) {
>          std::cout << "- cheese\n";
>      }
>      if (toppings[pizza_toppings::salami]) {
>          std::cout << "- salami\n";
>      }
>      if (toppings[pizza_toppings::olives]) {
>          std::cout << "- olives\n";
>      }
>      if (toppings[pizza_toppings::garlic]) {
>          std::cout << "- garlic\n";
>      }
>      std::cout << "\n";
>    }
> 
> Isn't that so much more readable and compact?
> 

Much more. This is one of the reason i included bitset support in my
indexed_array library
( https://github.com/Julien-Blanc-tgcm/indexed_array ), the bitset
doing exactly that : access individual bits via an enum value.

I've come to the conclusion that any representation of enum flags with
C++ enums is a design mistake by itself (a pretty widespread one, but
still a mistake). Enums are individual values, enum flags are a set of
values, they are different by nature. In C++, different things deserve
a different type, call it an enum_bitset, an enum_set or whatever, but
donc make it a plain enum / enum class.

Regards,

Julien
_______________________________________________
Boost mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://lists.boost.org/mailman3/lists/boost.lists.boost.org/
Archived at: https://lists.boost.org/archives/list/[email protected]/message/PCS56TC676KLLMAA3CRVYEP3ZQLU6KRG/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.