我怎样才能创建一个带有标志的函数,比如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)
你也可以简单地声明整数常量,但在我看来,枚举更清晰.
注意:我更新了帖子以考虑一些评论,谢谢!
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位来生成连续的位掩码.这对于裸标志具有相同的值,但是对于我来说更容易读取,并且如果跳过或复制值,则显而易见.
我还喜欢在适当时组合一些常见的标志组合.
你可以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)
当然,您可以使用|运算符在标志中放置一个或多个标志.