Enum-Werte durchlaufen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Enum-Werte durchlaufen

Beitrag von Krishty »

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
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

Re: Enum-Werte durchlaufen

Beitrag von Stefan Zerbst »

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
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Enum-Werte durchlaufen

Beitrag von Krishty »

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) … :(
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
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

Beitrag von dowhilefor »

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 :)
Mein Gehirn besteht nur noch aus einem hash-index, ich weiss was ich kenn aber kenn nicht was ich weiss
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Enum-Werte durchlaufen

Beitrag von Krishty »

Ja, Einträge für den ersten und letzten Wert habe ich eh immer … zugegebenermaßen mal eine ganz nützliche Sache an Enums :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

Re: Enum-Werte durchlaufen

Beitrag von Stefan Zerbst »

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
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Enum-Werte durchlaufen

Beitrag von Krishty »

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.
Es gibt in meinem Fall keine virtuellen Methoden, darum machen das die Templates.
Stefan Zerbst hat geschrieben:Vielleicht zeigst du mal das eigentliche Problem. Ich denke nicht, dass eigene Verzweigungen über enums der richtige Ansatz sind.
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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

Re: Enum-Werte durchlaufen

Beitrag von Stefan Zerbst »

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
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Enum-Werte durchlaufen

Beitrag von Krishty »

Kommt da vielleicht was in C++09? Afaik sollten Enums da doch verbessert werden?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten