相关疑难解决方法(0)

如果你为枚举类static_cast无效值会发生什么?

考虑一下这个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)

标准是否保证会触发默认值?如果没有,在这里检查错误的正确,最有效,最优雅的方法是什么?

编辑:

作为奖励,该标准是否对此有任何保证,但是用简单的枚举?

c++ c++11

136
推荐指数
1
解决办法
3万
查看次数

C++ 使用枚举进行标志和按位运算,很容易

在 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)

c++ enums visual-studio-2010

0
推荐指数
1
解决办法
340
查看次数

标签 统计

c++ ×2

c++11 ×1

enums ×1

visual-studio-2010 ×1