题
如果我想使用二进制“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。
不隶属于 StackOverflow