如何使用标志参数创建函数?(C++)

10 c++ flags function

我怎样才能创建一个带有标志的函数,比如Windows的CreateWindow(... style | style,...),例如createnum函数:

int CreateNum(flag flags) //???
{
    int num = 0;
    if(flags == GREATER_THAN_TEN)
        num = 11;
    if(flags == EVEN && ((num % 2) == 1)
        num++;
    else if(flags == ODD && ((num % 2) == 0)
        num++;
    return num;
}
//called like this
int Number = CreateNum(GREATER_THAN_TEN | EVEN);
Run Code Online (Sandbox Code Playgroud)

这是可能的,如果是的话,怎么样?

Pao*_*sco 29

您可以定义一个指定"单位"值的枚举(请注意,封闭结构仅在此处作为命名上下文,因此您可以编写例如MyFlags::EVEN):

struct MyFlags{
    enum Value{
        EVEN                           = 0x01,
        ODD                            = 0x02,
        ANOTHER_FLAG                   = 0x04,
        YET_ANOTHER_FLAG               = 0x08,
        SOMETHING_ELSE                 = 0x10,
        SOMETHING_COMPLETELY_DIFFERENT = 0x20
    };
};
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

int CreateNum(MyFlags::Value flags){
    if (flags & MyFlags::EVEN){
        // do something...
    }
}

void main(){
    CreateNum((MyFlags::Value)(MyFlags::EVEN | MyFlags::ODD));
}
Run Code Online (Sandbox Code Playgroud)

或者只是这样:

int CreateNum(int flags){
    if (flags & MyFlags::EVEN){
        // do something...
    }
}

void main(){
    CreateNum(MyFlags::EVEN | MyFlags::ODD);
}
Run Code Online (Sandbox Code Playgroud)

你也可以简单地声明整数常量,但在我看来,枚举更清晰.

注意:我更新了帖子以考虑一些评论,谢谢!

  • 也许你可以让你的枚举更长,明确它有两个权力? (5认同)
  • @Marcus:在我看来,用2种符号犯错的可能性相同,你不觉得:)? (2认同)

Dol*_*hin 11

我赞成了orsogufo的答案,但我总是喜欢在定义值时执行以下操作:

enum Value{
  EVEN                           = (1<<0),
  ODD                            = (1<<2),        
  ANOTHER_FLAG                   = (1<<3),        
  YET_ANOTHER_FLAG               = (1<<4),        
  SOMETHING_ELSE                 = (1<<5),        
  SOMETHING_COMPLETELY_DIFFERENT = (1<<6),

  ANOTHER_EVEN                   = EVEN|ANOTHER_FLAG
};
Run Code Online (Sandbox Code Playgroud)

<<是班次运营商.增加右侧可以通过一次移动1位来生成连续的位掩码.这对于裸标志具有相同的值,但是对于我来说更容易读取,并且如果跳过或复制值,则显而易见.

我还喜欢在适当时组合一些常见的标志组合.


Pat*_*ola 5

你可以const int像这样使用:

const int FLAG1 = 0x0001;
const int FLAG2 = 0x0010;
const int FLAG3 = 0x0100;
// ...
Run Code Online (Sandbox Code Playgroud)

当你使用它时:

int CreateNum(int flags)
{
    if( flags & FLAG1 )
        // FLAG1 is present

    if( flags & FLAG2 )
        // FLAG2 is present

    // ...
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用|运算符在标志中放置一个或多个标志.

  • 将`#define FLAG1 0x0001`更改为`const int FLAG1 = 0x0001;` (4认同)