C ++中一个函数参数多个枚举使用按位或“|”
-
18-09-2019 - |
题
我最近遇到了一些功能来的地方,你可以传递多个枚举这样的:
myFunction(One | Two);
因为我觉得这是一个非常优雅的方式我试图实现类似的东西我:
void myFunction(int _a){
switch(_a){
case One:
cout<<"!!!!"<<endl;
break;
case Two:
cout<<"?????"<<endl;
break;
}
}
现在,如果我尝试调用函数一个|二,我想这两个开关的情况下被调用。我不是二进制运营商真的很好,所以我真的不知道该怎么办。任何想法将是巨大的!
谢谢!
解决方案
有关,你必须做出这样的枚举:
enum STATE {
STATE_A = 1,
STATE_B = 2,
STATE_C = 4
};
即。枚举元素值应在2的幂来选择有效的情况下,或者如果语句。
所以,当你做这样的:
void foo( int state) {
if ( state & STATE_A ) {
// do something
}
if ( state & STATE_B ) {
// do something
}
if ( state & STATE_C ) {
// do something
}
}
int main() {
foo( STATE_A | STATE_B | STATE_C);
}
其他提示
位运算符仅与2的幂表现良好:
0010
| 0100
------
0110 // both bits are set
0110
& 0100
------
0100 // nonzero, i.e. true: the flag is set
如果你尝试做相同的任意数字,你会得到意想不到的结果:
0101 // 5
| 1100 // 12
------
1101 // 13
其中包含了可能的(任意)号码为组标志:0001
(1),0100
(4),0101
(5),1000
(8),1001
(9),1100
(12),1101
(13)
因此,与其让两个选项,你只是给了六人。
一般被组合这种方式参数是标志(以单个比特组的值)为1的十进制值,2,4,8,等等假设一和二按照这一规则,则不能使用的开关同时检查。交换机只遵循一条路径。您的组合参数不等于一个或两个,但它们的组合(1 | 2 == 3)。您可以检查是否一个或两个设置是这样的:
if (_a & One)
{
}
if (_a & Two)
{
}
请记住,没有明确的价值标准将枚举数只向上,不使用下位。如果你的下一个定义的值是三个,它可能会等于3这是不是一个单一的位的值,然后将充当如果你已通过两个标志(一|二)将功能。你需要设置的值枚举自己。
您必须拆分可能的“令牌”(当然不重叠...使用的功率2):
if (_a & One) { ... }
不优雅确实要与1条switch语句的内容:使用if
语句拆分
您最好还是用一组做,如果语句...
即
if ( _a & ONE )
{
// Do stuff.
}
if ( _a & TWO )
{
// Do other stuff.
}
编辑:你也可以做一个switch语句,但是这将是一个噩梦。你几乎需要像这样
switch( _a )
{
case ONE:
// Handle ONE.
break;
case TWO:
// Handle TWO.
break;
case ONE | TWO:
// Handle ONE.
// Handle TWO.
break;
};
其相对理智只有2个选项,但一旦你得到比它开始的气圈控制的更多信息。如果你有32个选项你必须是不太可能,以适应任何机器上的switch语句。所有在“如果”溶液是更清洁和更健全的:)