1

バイナリの「フラグ」を使用して状態やオプションなどを表現したい場合は、それらを渡して、0001 と 0010 のようなオブジェクトに格納し、OPTION1 | OPTION2渡さOPTION1れるOPTION2ものが 0011 になるようにして、オプションの組み合わせを表します。 .

C ++でこれを行うにはどうすればよいですか? みたいなことを考えていた

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

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

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

しかし、理想的にdoSomethingは、与えられたオプションを解釈する方法を知っています。

私は正しい軌道に乗っていますか?より良い方法はありますか?

アップデート

Optionまた、すべての可能な組み合わせを定義する必要はありませんか?

4

4 に答える 4

6

これは、これらのことを行う一般的な方法です。doSomethingビット単位の演算子を使用andして、オプションが選択されているかどうかを確認できます。

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

または、ビット フィールドの使用を検討できます。

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

Options o;
o.Option_1 = 1;
o.Option_2 = 0;
于 2009-09-10T19:22:35.080 に答える
4

それが私のやり方だろう。ただし、列挙をもう少し読みやすくするために使用できる多くのトリックがあります。

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

さらに、列挙にはビットごとの演算子を指定する必要があります。これを支援するASL のenum_opsユーティリティのようなものを検討してください。

于 2009-09-10T19:24:58.680 に答える
3

人々が通常そのようなフラグを使用する方法は、関数を次のように定義することです。

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

他のすべてはあなたが望むように正確に動作します:)

もう 1 つの方法は、独自の「フラグ」クラスを作成することです。次に、クラスに次のような関数がいくつかあります。

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

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

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

または、演算子をオーバーロードして、希望どおりに実行することもできます。

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

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

等々。

于 2009-09-10T19:46:30.287 に答える
1

stlビットセットを確認することをお勧めします。一部の人々は、Cスタイルのビットフラグの代わりに常にそれらを使用する必要があると説きます。ただし、どちらのソリューションも優れたIMOです。

于 2009-09-10T21:27:32.783 に答える