考虑一下这个C++ 11代码:
enum class Color : char { red = 0x1, yellow = 0x2 }
// ...
char *data = ReadFile();
Color color = static_cast<Color>(data[0]);
Run Code Online (Sandbox Code Playgroud)
假设数据[0]实际上是100.根据标准设置的颜色是什么?特别是如果我以后做的话
switch (color) {
// ... red and yellow cases omitted
default:
// handle error
break;
}
Run Code Online (Sandbox Code Playgroud)
标准是否保证会触发默认值?如果没有,在这里检查错误的正确,最有效,最优雅的方法是什么?
编辑:
作为奖励,该标准是否对此有任何保证,但是用简单的枚举?
在 CI 中能够采用两个或多个枚举标志并包含或它们: (flag1 | flag2)
在 C++ 中,我不能做同样的事情。我有一些标志,我已将其范围限定在我的班级,但我必须对它们进行 OR 转换。它看起来像这样:
namespace name
{
class test
{
public:
enum flag
{
firstflag = 1, secondflag = 2, thirdflag = 4
};
void foo(flag flags)
{
return;
}
};
}
int main(int argc, char *argv[])
{
name::test obj;
obj.foo((name::test::flag)(name::test::firstflag | name::test::secondflag));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在实际代码中,这比这个例子要多。我想知道是否有更好的方法。我可以更改传递给 int 的参数,void foo(int flags)但是在 Visual Studio 2010 调试器中,我看不到 ORed 标志,只有一个数字。
没有演员我得到一个错误:
obj.foo(name::test::firstflag | name::test::secondflag);
error C2664: 'name::test::foo' : cannot convert parameter 1 from 'int' …Run Code Online (Sandbox Code Playgroud)