enum verdoppeln



  • Hallo,

    ich möchte eine Funktion schreiben, die verschiedene Flags als int (oder long ) entgegennehmen kann; in etwa so: void foo(int flags);
    Diese Flags wollen ja auch definiert sein... Dazu nehme ich eine Enumeration:

    enum {
        FLAG_1 = 1,
        FLAG_2 = 2,
        FLAG_3 = 4,
        FLAG_4 = 8,
        // ...
    };
    

    Diese Flags können dann per |-operator verknüpft werden.
    Und nun: wenn sich bei den Flags irgendetwas ändert, muss ich immer sofort die ganze liste durchgehen, und die Zahlenwerte korrigieren (also immer das doppelte vom Vorgänger).

    Gibt es nicht vielleicht eine enum-Variante, die die Werte ebenso verdoppelt speichert, ohne dass die Werte immer seperat eingegeben werden müssen?

    Ist mein Ansatz für meine "Flag-Funktion" so überhaupt richtig, oder würdet ihr das anderst lösen?



  • Der Ansatz passt, das sieht in DirectX zB genauso aus, allerdings nutzt man dort eine unsigned Variable dafür. Beim enum denke ich nicht das es anders geht, du wirst wohl um das manuelle anpassen nicht drumherum kommen.



  • Hallo,

    du könntest auch std::map verwenden

    Dann kannst du in ner Schleife die Namen und die Werte hochzählen

    Gruß Simon



  • enum {
        FLAG_1 = 1,
        FLAG_2 = FLAG_1*2,
        FLAG_3 = FLAG_2*2,
        FLAG_4 = FLAG_3*2,
        // ...
    };
    

    aber wozu? feste werte sind schon ok, denn flags ändern sich so selten, daß es sich vermutlich nicht lohnt, besondere sachen dafür zu erfinden.



  • OK danke 🙂
    dann mach ichs am besten manuell



  • [cpp]
    enum {
    FLAG_1 = 1 << 0,
    FLAG_2 = 1 << 1,
    FLAG_3 = 1 << 2,
    FLAG_4 = 1 << 3,
    // ...
    };



  • ......... schrieb:

    enum {
        FLAG_1 = 1 << 0,
        FLAG_2 = 1 << 1,
        FLAG_3 = 1 << 2,
        FLAG_4 = 1 << 3,
        // ...
    };
    

    halte ich persönlich für etwas aufwendig^^



  • daersc schrieb:

    ......... schrieb:

    enum {
        FLAG_1 = 1 << 0,
        FLAG_2 = 1 << 1,
        FLAG_3 = 1 << 2,
        FLAG_4 = 1 << 3,
        // ...
    };
    

    halte ich persönlich für etwas aufwendig^^

    ich finds schöner als den rest - _sehr_ viel schöner...

    bb



  • unskilled schrieb:

    daersc schrieb:

    ......... schrieb:

    enum {
        FLAG_1 = 1 << 0,
        FLAG_2 = 1 << 1,
        FLAG_3 = 1 << 2,
        FLAG_4 = 1 << 3,
        // ...
    };
    

    halte ich persönlich für etwas aufwendig^^

    ich finds schöner als den rest - _sehr_ viel schöner...
    bb

    dann nehmen wir jetzt diese version. wobei ich hoffe, daß du nix gegen

    enum {
        FLAG_1 = 1<<0,
        FLAG_2 = 1<<1,
        FLAG_3 = 1<<2,
        FLAG_4 = 1<<3,
        // ...
    };
    

    hast, das betont noch ein wenig, daß die werte 1<<3 und so atomar sind. hab den thread geerade verlegt, der das ausfühlich begründet, aber es hatte was mit scoping mit attention reduction und anti mental noise propagation zu tun.


Log in to reply