Flags kombinieren
-
enum color { blue=1, red=2, yellow=4, green=8 }; color c = 7; //sehr intuitiv...
wie willst du das bewerkstelligen? entweder int und prüfen geht so
int a = red | blue; if (a & red) ... if (a & green) ... etc.
oder eben alle werte erlauben und implizit von int zu enumerator konvertieren.
- ersteres finde ich besser, denn wenn ich nicht gerade flags verwende, erwarte ich, dass ein objekt typ color eine farbe von denen ist, die ich vorgebe.
(außerdem: 7.2/5)was du noch tun könntest, wenn du einen kompromis suchst:
Flag operator | (Flag a, Flag b) { return static_cast<Flag>(int(a)|b); }
ein hässlicher workaround..
-
Shade Of Mine schrieb:
Was stört dich an Flags?
dass sie, wenn man sie auf herkömmliche art und weise verwendet (defines bzw. globale consts) keine bindung zur klasse/funktion haben. dann hat man da so eine funktion, die statt selbsterklärender parameter einfach irgendwelche flags will und muss sich erstmal durch den code wühlen, um herauszufinden, was man denn da nehmen könnte.
die sache mit den namespaces ist imho auch nicht so toll. denn da besteht wieder die gefahr, dass ich 2 namespaces gleichzeitig verwende, in denen flags mit gleichem namen sind (sachen wie zb. TRANSPARENT etc. gibts wohl oft mehr als einmal).
"sauber" scheint nur zu sein, wenn ich die flags direkt in die klasse packe, aber dann jedesmal KlasseA::FLAG zu schreiben geht einem auch ganz schnell auf den wecker...