如果我想使用二进制“flags”表示状态或选项或类似的东西。这样我就可以传递它们并将它们存储到像 OPTION1 |这样的对象中OPTION2 其中 OPTION1 为0001且 OPTION2 为0010,因此传递的内容为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 吗?

有帮助吗?

解决方案

这是完成这些事情的常见方式。 doSomething 可以使用按位运算符来查看是否选择了一个选项:

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;

其他提示

这就是我做的方式。但是,您可以使用许多技巧使枚举更具可读性:

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

此外,您还需要为枚举指定按位运算符。考虑使用 ASL的 enum_ops 实用程序来帮助解决这个问题。

值得注意的是,人们通常使用这种标志的方式是定义函数如下:

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 );
}

等等。

您可以查看 stl bitset 。有些人会鼓吹你应该总是使用那些而不是C风格的bitflags。但是,这两种解决方案都很好IMO。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top