Enum-Werte durchlaufen
- Krishty
- Establishment
- Beiträge: 8343
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Enum-Werte durchlaufen
Hi,
Wie kann ich alle gültigen Werte eines enums typsicher durchlaufen? operator ++ gibt es ja nicht … durch static_cast und Integer-Arithmetik kann ich das Problem zwar umgehen, aber gibt es auch eine saubere Lösung?
Gruß, Ky
Wie kann ich alle gültigen Werte eines enums typsicher durchlaufen? operator ++ gibt es ja nicht … durch static_cast und Integer-Arithmetik kann ich das Problem zwar umgehen, aber gibt es auch eine saubere Lösung?
Gruß, Ky
-
- Moderator
- Beiträge: 189
- Registriert: 25.02.2009, 19:54
Re: Enum-Werte durchlaufen
Hi,
so weit ich weiss gibt es dafür keine saubere Lösung. Bzw. ein cast auf Integer ist eigentlich eine "saubere" Lösung, abgesehen davon, dass du inkrementelle Werte in der enum garantieren musst. Enums sind aber designtechnisch gar nicht dazu gedacht in einer Schleife durchlaufen zu werden. Ein switch ohne default Zweig mit einem vernünftigen Compiler sorgt dafür,d ass man immer alle Werte abfragt :)
Ciao,
Stefan
so weit ich weiss gibt es dafür keine saubere Lösung. Bzw. ein cast auf Integer ist eigentlich eine "saubere" Lösung, abgesehen davon, dass du inkrementelle Werte in der enum garantieren musst. Enums sind aber designtechnisch gar nicht dazu gedacht in einer Schleife durchlaufen zu werden. Ein switch ohne default Zweig mit einem vernünftigen Compiler sorgt dafür,d ass man immer alle Werte abfragt :)
Ciao,
Stefan
- Krishty
- Establishment
- Beiträge: 8343
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Enum-Werte durchlaufen
Ja, inkrementelle Werte kann ich zum Glück garantieren … trotzdem miese Sache, enums hasse ich seit jeher … schade.
Ich durchlaufe die Werte nicht in einer Schleife … ich brauche aber ein 2D-Switch für 24 Enum-Werte (Double Dispatch) – also ein verzweigtes Switch mit insgesamt 576 Möglichkeiten – und möchte es natürlich nicht von Hand schreiben (besonders, weil es noch erweitert wird), sondern habe es durch templates automatisiert. Die einzige unsaubere Stelle ist das ständige static_cast<EnumType>(EnumValue + 1) … :(
Ich durchlaufe die Werte nicht in einer Schleife … ich brauche aber ein 2D-Switch für 24 Enum-Werte (Double Dispatch) – also ein verzweigtes Switch mit insgesamt 576 Möglichkeiten – und möchte es natürlich nicht von Hand schreiben (besonders, weil es noch erweitert wird), sondern habe es durch templates automatisiert. Die einzige unsaubere Stelle ist das ständige static_cast<EnumType>(EnumValue + 1) … :(
- dowhilefor
- Moderator
- Beiträge: 173
- Registriert: 27.02.2009, 15:44
- Alter Benutzername: 6SidedDice
- Echter Name: Nico Probst
- Wohnort: Bochum
- Kontaktdaten:
Re: Enum-Werte durchlaufen
Wie wärs mit einem Number enum eintrag am Ende des enums? Wird recht häufig gemacht, damit hättest du schonmal die Maximal anzahl an enums.
Edith war zu langsam und ging eh am Thema vorbei :)
Edith war zu langsam und ging eh am Thema vorbei :)
Mein Gehirn besteht nur noch aus einem hash-index, ich weiss was ich kenn aber kenn nicht was ich weiss
- Krishty
- Establishment
- Beiträge: 8343
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Enum-Werte durchlaufen
Ja, Einträge für den ersten und letzten Wert habe ich eh immer … zugegebenermaßen mal eine ganz nützliche Sache an Enums :)
-
- Moderator
- Beiträge: 189
- Registriert: 25.02.2009, 19:54
Re: Enum-Werte durchlaufen
Hi,
also bei Double Dispatch entscheidest du doch nicht selber anhand eines enums wohin der Aufruf geht. Die Idee dabei ist ja gerade, dass die virtuellen Methoden das selber machen. Vielleicht zeigst du mal das eigentliche Problem. Ich denke nicht, dass eigene Verzweigungen über enums der richtige Ansatz sind.
Ciao,
Stefan
also bei Double Dispatch entscheidest du doch nicht selber anhand eines enums wohin der Aufruf geht. Die Idee dabei ist ja gerade, dass die virtuellen Methoden das selber machen. Vielleicht zeigst du mal das eigentliche Problem. Ich denke nicht, dass eigene Verzweigungen über enums der richtige Ansatz sind.
Ciao,
Stefan
- Krishty
- Establishment
- Beiträge: 8343
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Enum-Werte durchlaufen
Es gibt in meinem Fall keine virtuellen Methoden, darum machen das die Templates.Stefan Zerbst hat geschrieben:bei Double Dispatch entscheidest du doch nicht selber anhand eines enums wohin der Aufruf geht. Die Idee dabei ist ja gerade, dass die virtuellen Methoden das selber machen.
Ich schon, schließlich funktioniert es perfekt … nur dass mich der eine static_cast ein wenig stört ;) Im Grunde geht es darum, bei der Konvertierung verschiedener Bildformate (R8G8B8, A8, DXT1 usw) die richtigen Funktionen den richtigen Formaten zuzuweisen, wobei die Funktionen Templates sind und für jede Konvertierung spezialisiert werden können.Stefan Zerbst hat geschrieben:Vielleicht zeigst du mal das eigentliche Problem. Ich denke nicht, dass eigene Verzweigungen über enums der richtige Ansatz sind.
-
- Moderator
- Beiträge: 189
- Registriert: 25.02.2009, 19:54
Re: Enum-Werte durchlaufen
Okay bei Templates ist das nicht so leicht mit den virtuellen Methoden :oops:
In einem solchen Fall würde ich das static_cast auch nicht unbedingt als so übel ansehen. So lange du selber die Kontrolle über die enum Werte hast ist das okay und auch vollkommen valid das so zu machen. Es wäre in der Tat manchmal schön wenn es so etwas wie eine Schleife foreach für enums in C++ gäbe. Aber da es so etwas nicht gibt ist der cast in diesem Fall die nächstbeste Lösung.
Ciao,
Stefan
In einem solchen Fall würde ich das static_cast auch nicht unbedingt als so übel ansehen. So lange du selber die Kontrolle über die enum Werte hast ist das okay und auch vollkommen valid das so zu machen. Es wäre in der Tat manchmal schön wenn es so etwas wie eine Schleife foreach für enums in C++ gäbe. Aber da es so etwas nicht gibt ist der cast in diesem Fall die nächstbeste Lösung.
Ciao,
Stefan
- Krishty
- Establishment
- Beiträge: 8343
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Enum-Werte durchlaufen
Kommt da vielleicht was in C++09? Afaik sollten Enums da doch verbessert werden?