1

如果我想使用二进制“标志”来表示状态或选项或类似的东西,以便我可以传递它们并将它们存储到一个对象OPTION1 | OPTION2,比如OPTION10001 和OPTION20010,这样传递的就是 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 ) 
{
    //...
}

其他一切都将完全按照您的意愿工作:)

另一种方法是创建自己的“标志”类。然后你在类中有几个函数如下:

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 bitset。有些人会宣扬您应该始终使用那些而不是 C 样式的位标志。但是,这两种解决方案都很好 IMO。

于 2009-09-10T21:27:32.783 回答