我想知道如何做到这一点:
func(param1|param2|param3)
然后在函数中提取这些值,我已经在多个函数中看到了这个值,或者这样做更好:
func(param1, ...)
我试图用C ++做这个,我想把函数的参数作为枚举中的值。
我该如何解决这个问题?
答案 0 :(得分:17)
Param1,param2,param3通常定义为打开不同位的数字。
|
是按位替换的运算符,这意味着它适用于单独的位。
例如:
const int param1 = 0x01;
const int param2 = 0x02;
const int param3 = 0x04;
当你将一个参数传递给函数时,你可以选择先前定义的参数。 在函数中,您不进行分解,而是使用按位连接检查是否设置了指定位:
void func(int arg){
if(arg & param1)
// do something
if(arg & param2)
// do something else
// ...
}
func(param1 | param3);
// "do something" will be done,
// but "do something else" not.
答案 1 :(得分:13)
假设您将值作为独立位(2的幂),如:
#define IS_ON 0x01
#define IS_LARGE 0x02
#define IS_RED 0x04
(或等效的enums
或const int
值,具体取决于您的操作方式 - 我使用#define
只是因为它是我习惯的,)你可以传递它们:
funcname (IS_ON | IS_RED); // passes in 0x05
然后你用以下内容提取:
void funcname (int bitmask) {
if ((bitmask & IS_ON) == IS_ON) { // 0x05 & 0x01 -> 0x01
// IS_ON bit is set.
}
:
}
对于单比特说明符,您可以使用if (bitmask & IS_ON)
表单,但是如果您的说明符可能是多位值(如0到7的三位音量级别,则需要全面检查)例子)。
答案 2 :(得分:0)
这是如何使用任意按钮类型创建“MessageBox”函数的一个有用示例:
enum Button
{
OK = 0x0001,
CANCEL = 0x0010,
YES = 0x0100,
NO = 0x1000
};
void messagebox(char *text, int button)
{
char msg[256];
strcpy(msg, text);
if ((button & Button::OK) == Button::OK)
strcat(msg, " [OK]");
if ((button & Button::CANCEL) == Button::CANCEL)
strcat(msg, " [Cancel]");
if ((button & Button::YES) == Button::YES)
strcat(msg, " [Yes]");
if ((button & Button::NO) == Button::NO)
strcat(msg, " [No]");
cout << msg << endl;
}
int main()
{
messagebox("salam", Button::OK | Button::CANCEL);
return 0;
}