enums und bitweises OR



  • In C habe ich häufig enums und Bitverknüpfungen benutzt, also z.B.:

    enum types{a=1,b=2,c=4};
    
    void foo(types t)
    {
       if(t&a)
       {
         machWas();
       }
       if(t&b)
       {
         machWasAnderes();
       }
       if(t&c)
       {
         machWasGanzAnderes();
       }
    }
    
    void bar(void)
    {
      foo(a|b);
    }
    

    Wie ich jetzt gemerkt habe, geht das in C++ nicht wirklich.
    Was ist denn in C++ der Standardweg ein entsprechendes Verhalten zu erzeugen? Eine Unmenge von konstanten ints oder wildes gecaste kann es jawohl nicht sein...

    Gruß, Dirk



  • Du kannst einen enum implizit in einen int umwandeln, aber (zumindest unter C++) nicht wieder zurück - und die ganzen Bit-Operationen liefern auch ein int hinten heraus, also würde dein Beispiel vermutlich funktionieren, wenn du den Kopf von foo() änderst in "void foo(int t)".



  • Ja schon, aber gerade das möchte ich ja nicht..



  • Du musst Casten, es geht nicht anders... Enum zu Int geht implizit, Int zu Enum muss gecastet werden. Punkt 😉



  • Kleiner Denkfehler deinerseits. Ein Enum ist keine Menge. Dazu sollte man Enums auch in C nicht benutzen.



  • Naja, dieses Konstrukt ist aber schon ein sehr beliebtes Mittel in C.
    Aber egal, ich werde das anders regeln (über Mehrfachvererbung). Hintergrund ist ein Observer/Listener System, bei dem sich Listener für bestimmte Arten von Events anmelden können. Jetzt werde ich einfach für jede Event-Untermenge eine eigene virtuelle Listener-Klasse erstellen, das ist dann auch etwas schöner.
    Vielen Dank und Gruß,
    Dirk



  • Machs doch net zu kompliziert.

    namespace Types
    {
        typedef int Type;
        const int a = 1;
        const int b = 2;
        const int c = 4;
    }
    

Anmelden zum Antworten