我最近遇到了一些功能来的地方,你可以传递多个枚举这样的:

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语句。所有在“如果”溶液是更清洁和更健全的:)

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