Frage

Wenn ich wollte Zustände oder Optionen darstellen oder etwas ähnliches mit binär „Flags“, so dass ich sie passieren könnte und speichere sie auf ein Objekt wie OPTION1 | OPTION2 wo OPTION1 0001 und OPTION2 ist 0010, so dass das, was übergeben wird ist 0011, eine Mischung aus den Optionen darstellt.

Wie würde ich dies in C ++? Ich dachte so etwas wie

enum Option {
    Option_1 = 0x01,
    Option_2 = 0x02,
    Option_3 = 0x04,
    //...
}

void doSomething(Option options) {
    //...
}

int main() {
    doSomething(Option_1|Option_2);
}

Aber dann im Idealfall doSomething weiß, wie die gegebene Option zu interpretieren.

Bin ich auf dem richtigen Weg? Gibt es einen besseren Weg?

Aktualisieren

Und nicht ich habe eine Option für jede mögliche Kombination zu definieren, auch?

War es hilfreich?

Lösung

Dies ist ein üblicher Weg, diese Dinge getan werden. doSomething kann bitweise and Operator nachschauen, ob eine Option ausgewählt ist:

if (options & Option_1){ 
  // option 1 is selected
}

Alternativ können Sie prüfen, mit Bit-Felder :

struct Options {
    unsigned char Option_1 : 1;
    unsigned char Option_2 : 1;
};

Options o;
o.Option_1 = 1;
o.Option_2 = 0;

Andere Tipps

Das wäre so, wie ich es tun würde. Sie können jedoch gibt es viele Tricks die Aufzählung zu machen, ein wenig mehr lesbar verwenden:

enum Option {
    Option1 = 1 /*<< 0*/,
    Option2 = 1 << 1,
    Option3 = 1 << 2,
    // etc.
};

Was mehr ist, müssen Sie Bit-Operatoren für Ihre Aufzählung angeben. Betrachten wir so etwas wie ASL enum_ops Dienstprogramme mit diesem zu helfen.

Es ist erwähnenswert, dass die Art, wie Menschen in der Regel solche Flags verwenden ist die Funktion wie folgt zu definieren:

void doSomething( unsigned int options ) 
{
    //...
}

alles andere funktioniert genau so, wie Sie wollen:)

Der andere Weg ist Ihre eigene „Flags“ Klasse zu erstellen. Dann haben Sie ein paar Funktionen wie in der Klasse folgt:

bool GetOption( Option option )
{
    return (m_Option & option) > 0;
}

void SetOption( Option option )
{
    m_Option |= option;
}

void ClearOption( Option option )
{
    m_Option &= ~option;
}

oder auch die Betreiber überlasten genau das zu tun, wie Sie beispiel mögen:

Flags( unsigned int options ) :
   m_Option( options )
{
}

Flags operator|( const Flags& flags )
{
    return Flags( m_Option | flags.m_Option );
}

und so weiter.

Sie möchten die stl bitset überprüfen. Manche Leute würden predigen, dass Sie immer die anstelle von C-Stil bitflags verwenden sollten. Allerdings sind beide Lösungen IMO in Ordnung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top