Namen von Enumeratoren



  • Hallo Leute, nehmen wir einmal an, ich habe folgenden Enumerator:

    enum K2D_ExceptionCode{
      K2D_PARAMETER = 1,
      K2D_CAPABILITY = 2,
      K2D_FILE = 3,
      K2D_UNKNOWN = 4
     };
    

    Gibt es nun irgend eine möglichkeit, den Namen zur Laufzeit zu erhalten ?

    Bisher habe in dieser Art gelöst: Hässlich !!!

    K2D_ExceptionCode eCode = K2D_FILE;
    
    switch(eCode){
     case K2D_PARAMETER: cout << "K2D_PARAMETER"; break;
     case K2D_CAPABILITY: cout << "K2D_CAPABILITY"; break;
     case K2D_FILE: cout << "K2D_FILE"; break;
     case K2D_UNKNOWN: cout << "K2D_UNKNOWN"; break;
    }
    

    Gibt es keine Möglichkeit, das irgendwie folgendermassen zu lösen ?

    K2D_ExceptionCode eCode = K2D_FILE;
    
    cout << getEnumertatorString(eCode);
    

    Ich wünsch euch was ! 🙂
    Gruss Ishildur



  • Nein.



  • Mit Makro-Magie kannst du es etwas abkürzen:

    std::string getEnumertatorString(K2D_ExceptionCode eCode)
    {
        #define FOO(name) case name: return #name;
        switch(eCode){
            FOO(K2D_PARAMETER)
            // ...
        }
        #undef FOO
    }
    


  • http://www.cuj.com/documents/s=8470/cujboost0306besser/

    Allerdings finde ich die Lösung auch nicht wirklich hübsch...



  • Das sieht sehr nach fehlerbehandlung aus. wie wärs mit "normalen" Exceptions, statt wirren Aufzählungen.



  • Helium: Wenn du 50 Fehlercodes hast, machst du dann 50 Exceptionklassen?



  • Nein. Eine Klasse, die sich den Fehler merkt. Da es im Falle eines Fehler garantiert nicht mehr auf Geschwindigkeit ankommt, kann man aber direkt einen String verwenden, um den Fehler zu identifizieren.

    throw K2D_exeption("Capability");
    

    Da meine Klasse eine Methode 'what' hat kann ich dann auch ganz einfach den Fehler erkennen.



  • Bashar schrieb:

    Helium: Wenn du 50 Fehlercodes hast, machst du dann 50 Exceptionklassen?

    Wozu leicht, wenns auch schwer geht, gell?
    Man nimmt für jede Zahl warscheinlich auch eine neue Variable und lassen die Zuweisung weg.

    Naja, wie auch immer, durch Ableitung etc. kann man schon mit 2 - 3 Klassen alles an Fehlerbehandlung erreichen, was man braucht. Für einfache Strings reicht auch schon eine Klasse, aber wenn man z.B. mit DirectX arbeitet, wäre es auch nicht schlecht eine Klasse abzuleiten, die die hresult Werte zurückgibt.


Anmelden zum Antworten