Things C++ 20 Deliberately Broke
Ola Fosheim Grøstad
ola.fosheim.grostad at gmail.com
Tue Sep 27 08:11:10 UTC 2022
On Tuesday, 27 September 2022 at 01:54:19 UTC, Steven
Schveighoffer wrote:
> I misremembered how enums work in (old) C/C++. But it seems
> really awkward to make it difficult to extract the real value.
> I also don't see a huge harm in it implicitly converting, as D
> has allowed.
>
> I suppose using namespaces and constexpr, one can *almost*
> mimic the behavior. But it's still not a type.
Hm, do you mean enums or constexpr? Constexpr constants are
usually put inside a class. So you access them as
`ClassName::constant_name`. C++20 also allows accessing enums
through the class scope by allowing the `using` statement to
apply to enums inside a class definition. So you can certainly
build an enum like type with more advanced features than regular
enums in C++. You can do it with enums, or without enums.
You can use enums to create new nominal integers. An example of
this is std::byte which is defined like this:
```C++
enum class byte : unsigned char {} ;
```
As a result you cannot use operators on a `byte` and you now have
a type for unassuming octets. You can do this for your own
integer-based type quite easily and define the operations you
want.
> It seems the intuitive behavior is not readily accessible with
> C++.
The intuitive behaviour for an enumeration are the operations:
comparison, successor, predecessor.
It gets a bit messier in C/C++ as you also tend to use it for
bitsets. Which probably should be a different concept. Anyway,
I've started to use `enum class` for almost everything and then
define overloaded set-functions that work on them. That way you
encapsulate the casting and bit manipulation and hopefully get
fewer bugs as a result.
More information about the Digitalmars-d
mailing list