Veroderung von enum-Werten
-
@Enumerator
Wo ist diesbezüglich der Unterschied ob man es jetzt mit enums oder gleich mit ints macht? Ints schützen dich auch nicht davor "verbotenet" Kombinationen zu bilden.Und wo ist der Unterschied zwischen normalen Flags und irgendwelchen Bits in irgendwelchen Registern?
Auch bei normalen APIs gibt es immer wieder Bitkombinationen die nicht erlaubt sind.Was man durch enums in diesem Fall trotzdem gewinnt, ist die Sicherheit nicht (unabsichtlich) Konstanten die für Register A definiert werden in Register B zu schreiben. Also dass wenn ich
TuWas(BLUBBCMD_BLUB, BLUBBMODE_USE_DMA)
schreibe, auch wirklich gemeint ist dass Blubb bitte mit DMA blubbern soll. Und ich nicht dummerweise die Parameter vertauscht habe,TuWas
die falschen Werte in die Register schreibt, und dadurch irgendwas komplett unerwartetes passiert.----
Oder andersrum: hast du was besseres anzubieten? Ich sag' ja nicht dass enums eine völlig optimale Lösung sind. Ich sag nur sie haben, wenn es um Flags geht, Vorteile gegenüber der Verwendung von "nackten" Integern. Und verwehre mich daher dagegen dass es "unsauber" wäre genau das zu machen.
ps:
Falls du das überlesen haben solltest...Der
static_cast
wird ja bei der von mir bevorzugten Variante nur innerhalb der | und & Operator-Funktionen für den Flags-Enum-Typ verwendet. D.h. an genau zwei Stellen pro Typ. Wenn man sich ein Makro dafür schreibt hat man es sogar nur an zwei Stellen im ganzen Programm, egal wie viele Flags-Typen man definiert.
Das reicht um den User gegen "sich unabsichtlich ins Knie schiessen" zu schützen.
Und gegen "sich absichtlich ins Knie schiessen" kann man in C++ sowieso nie etwas absichern.