c ++使用按位或"|"在一个函数参数中的多个枚举

mok*_*oka 9 c++ enums binary-operators switch-statement

我最近遇到了一些函数,你可以传递这样的多个枚举:

myFunction(One | Two);
Run Code Online (Sandbox Code Playgroud)

因为我认为这是一种非常优雅的方式,所以我尝试自己实现这样的方式:

void myFunction(int _a){
    switch(_a){
        case One:
            cout<<"!!!!"<<endl;
            break;
        case Two:
            cout<<"?????"<<endl;
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试用One |调用该函数 二,我希望两个开关案例都被调用.我对二元运算符不是很好,所以我真的不知道该怎么做.任何想法都会很棒!

谢谢!

Ash*_*ish 14

为此你必须制作如下枚举:

enum STATE {
  STATE_A = 1,
  STATE_B = 2,
  STATE_C = 4
};
Run Code Online (Sandbox Code Playgroud)

即枚举元素值应为2的幂,以选择有效的case或if语句.

所以当你喜欢的时候:

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 更好的是,使用`enum STATE {STATE_A = 1 << 0,STATE_B = 1 << 1,STATE_C = 1 << 2};` - 我发现更明确. (9认同)
  • 顺便说一句,他们不会是州.国家意味着排他性.它们更可能是标志(各个标志彼此独立). (3认同)

Gyö*_*sek 9

按位运算符仅在2的幂下表现良好:

  0010
| 0100
------
  0110  // both bits are set


  0110
& 0100
------
  0100  // nonzero, i.e. true: the flag is set
Run Code Online (Sandbox Code Playgroud)

如果你尝试用任意数字做同样的事情,你会得到意想不到的结果:

  0101  // 5
| 1100  // 12
------
  1101  // 13
Run Code Online (Sandbox Code Playgroud)

其中包含可能的(任意)数字作为设置标志:0001(1),0100(4),0101(5),1000(8),1001(9),1100(12),1101(13)

所以不是给出两个选项,而是给出了六个选项.