Prüfen ob ein Wert in einem Enum enhalten ist.



  • namespace_cpp schrieb:

    Hallo

    Kann ich auf einfache Weise prüfen ob ein Wert in einem enum vorhanden ist?

    Wozu solltest du das brauchen? Enums sind nicht zum rechnen da. Deshalb sollte man auch nicht versuchen, Enums mit irgendwelchen Zahlen/Werten zu identifizieren/vergleichen.



  • Naja, gibt schon Anwendungsfälle...
    Wenn man z.B. Daten in eine Textdatei schreibt und anschliessend wieder einliest könnte eine Plausibilitätsprüfung sinnvoll sein.



  • DocShoe schrieb:

    Naja, gibt schon Anwendungsfälle...
    Wenn man z.B. Daten in eine Textdatei schreibt und anschliessend wieder einliest könnte eine Plausibilitätsprüfung sinnvoll sein.

    Die eingelesenen Textdaten sind strings. die kannst du mit Standardmitteln bestenfalls noch in einen int oder ähnliches konvertieren. Beides kannst du aber nicht einfach einem Enum-Wert zuweisen, daher musst du so oder so eine eigene Konvertierugnsfunktion schreiben, in der du die Umwandlung text->enumtyp bzw. int->enumtyp per switch/case oder if-else-kaskaden vornimmst. In beiden Fällen kommst du nicht drumrum den Wert mit allen erlaubten Werten zu vergleichen.



  • Man könnte ja alle erlaubten enums in ein set packen und dann testen.



  • Braunstein schrieb:

    Man könnte ja alle erlaubten enums in ein set packen und dann testen.

    Nochmal die Frage: wozu? Wenn du eine Variable vom Typ MyEnum hast, dann kann die nur die Werte enthalten, die du als mögliche Werte für MyEnum definiert hast. Was willst du da noch groß testen?



  • Klingt für mich fast so als würde der Autor hier das Pendant zum "Set" von Delphi/Object Pascal suchen, also eine Art

    if (Wert enthalten in Set)-Abfrage?


  • Administrator

    pumuckl schrieb:

    Braunstein schrieb:

    Man könnte ja alle erlaubten enums in ein set packen und dann testen.

    Nochmal die Frage: wozu? Wenn du eine Variable vom Typ MyEnum hast, dann kann die nur die Werte enthalten, die du als mögliche Werte für MyEnum definiert hast. Was willst du da noch groß testen?

    Das stimmt nicht.

    enum MyEnum
    {
      YES = 0,
      NO
    };
    
    int main()
    {
      MyEnum e = static_cast<MyEnum>(234234);
    }
    

    Das ist erlaubt, es ist allerdings undefiniert, welchen Wert e annehmen wird. Zum Beispiel MSVC und GCC lassen den Wert unverändert.

    Grüssli



  • Dravere schrieb:

    enum MyEnum
    {
      YES = 0,
      NO,
      FILE_NOT_FOUND
    };
    
    int main()
    {
      MyEnum e = static_cast<MyEnum>(234234);
    }
    

    FTFY



  • Dravere schrieb:

    int main()
    {
      MyEnum e = static_cast<MyEnum>(234234);
    }
    

    Das ist erlaubt, es ist allerdings undefiniert, welchen Wert e annehmen wird.

    Wobei in der Praxis wahrscheinlich weniger willkürliche Literale da stehen als z.B. serialisierte Variablen (wie von DocShoe erwähnt). 😉

    Man kann sich natürlich auch eine Umwandlungstabelle String-Enum schreiben, aber oft reicht auch ein einfacher int . Sofern man dafür sorgt, dass das Programm die Daten korrekt behandelt und Pfusch des Anwenders nicht akzeptiert wird, ist das kein grosses Problem mehr.

    Ansonsten ein Set oder bei aufeinanderfolgenden Werten eine Bereichsprüfung. Zumindest muss man die Prüfung von enum -Werten mühsam manuell erledigen.



  • Dravere schrieb:

    Das stimmt nicht.

    enum MyEnum
    {
      YES = 0,
      NO
    };
    
    int main()
    {
      MyEnum e = static_cast<MyEnum>(234234);
    }
    

    Das ist erlaubt, es ist allerdings undefiniert, welchen Wert e annehmen wird. Zum Beispiel MSVC und GCC lassen den Wert unverändert.

    Grüssli

    Na ok, mit fiesen Casts kann man immer alles kaputt machen, das lass ich nicht gelten. Wer sich mit gewalt ins Knie schießen will, den soll man davon auch nicht abhalten 😉


  • Administrator

    pumuckl schrieb:

    Na ok, mit fiesen Casts kann man immer alles kaputt machen, das lass ich nicht gelten. Wer sich mit gewalt ins Knie schießen will, den soll man davon auch nicht abhalten 😉

    Es geht hier nicht um den Cast, es geht darum, dass ein Enum-Wert andere Werte speichern kann. Wenn du einen Enum-Wert serialisierst, bzw. deserialisierst, dann musst du seinen Wert auf Gültigkeit prüfen, da es eben möglich ist, dass andere Werte drin stehen.

    Grüssli


Anmelden zum Antworten