13
4

5 回答 5

23

您需要将ints 强制转换为 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 回答