如果我想使用二进制“flags”表示状态或选项或类似内容,以便我可以传递它们并将它们存储到像OPTION1 | OPTION2
OPTION1
其中OPTION2
为enum Option {
Option_1 = 0x01,
Option_2 = 0x02,
Option_3 = 0x04,
//...
}
void doSomething(Option options) {
//...
}
int main() {
doSomething(Option_1|Option_2);
}
的对象中}是0010,所以传递的是0011,表示选项的混合。
我将如何在C ++中执行此操作?我在想像
doSomething
但理想情况下,Option
知道如何解释给定的选项。
我是否在正确的轨道上?有没有更好的办法?
更新
我不是必须为每种可能的组合定义{{1}}吗?
答案 0 :(得分:6)
这是完成这些事情的常见方式。 doSomething
可以使用按位and
运算符来查看是否选择了某个选项:
if (options & Option_1){
// option 1 is selected
}
或者,您可以考虑使用bit fields:
struct Options {
unsigned char Option_1 : 1;
unsigned char Option_2 : 1;
};
Options o;
o.Option_1 = 1;
o.Option_2 = 0;
答案 1 :(得分:4)
这就是我做的方式。但是,您可以使用许多技巧使枚举更具可读性:
enum Option {
Option1 = 1 /*<< 0*/,
Option2 = 1 << 1,
Option3 = 1 << 2,
// etc.
};
此外,您还需要为枚举指定按位运算符。考虑像ASL's enum_ops
实用程序这样的东西来帮助解决这个问题。
答案 2 :(得分:3)
值得注意的是,人们通常使用这种标志的方式是定义函数如下:
void doSomething( unsigned int options )
{
//...
}
其他一切将完全按照您的意愿运作:)
另一种方法是创建自己的“Flags”类。然后你在课堂上有以下几个函数:
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 );
}
等等。
答案 3 :(得分:1)
您可能想查看stl bitset。有些人会鼓吹你应该总是使用那些而不是C风格的bitflags。但是,这两种解决方案都很好IMO。