问问题
2869 次
5 回答
23
您需要将int
s 强制转换为 C++ 中的枚举,但您可以在自定义OR
运算符中隐藏强制转换:
CEnumType operator|(CEnumType lhs, CEnumType rhs) {
return (CEnumType) ((int)lhs| (int)rhs);
}
有了这个运算符,您就可以编写您的原始
do_something(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA);
它将毫无问题地编译和运行。
于 2012-04-26T18:20:34.500 回答
6
对于枚举,C++ 比 C 有更严格的规则。调用时需要将值转换为枚举类型:
do_something((CEnumType)(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA));
int
或者,如果你想避免每次调用它时都编写强制转换,你可以编写一个包装函数来为你进行强制转换:
void do_something_wrapper(int types)
{
do_something((CEnumType)types);
}
...
do_something_wrapper(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA);
虽然我不知道我是否想看看当你用香蕉交叉苹果时你会得到什么......
于 2012-04-26T18:18:59.850 回答
5
在按位运算的情况下,表达式计算为原始类型,即int
,long
等。但是,您的函数采用非原始类型 ( CEnumType
)。我知道绕过这个的唯一方法是强制转换表达式。例如:
do_something((CEnumType) (C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA));
于 2012-04-26T18:20:19.583 回答
1
CEnumType A;
A = (CEnumType)(A | C_ENUM_VALUE_APPLE);
你也可以这样使用它。
于 2013-10-30T01:54:38.023 回答
0
通过 or-ing 两个枚举值,您正在创建一个无效值(0x3 不在枚举 CEnumType 中)。枚举不是位域。如果你想要一个位域,定义一个。
如果您想强制它通过,您可以强制转换该值,但这可能会让一些仅指望能够获取枚举值的代码感到惊讶。
do_something((CEnumType)(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA));
于 2012-04-26T18:18:38.213 回答