C++范围的枚举,可以隐式转换为整数

McM*_*ton 6 c++ enums

我有一个关于enums和enum classs 的不同形式的问题,特别是指定了大量(作用域!)常量.

我想知道是否有办法声明一个scoped enum,它可以隐式转换为整数.用于此的用例是指定寄存器地址并能够使用类似的方式访问它们MY_REGISTERS::FOO.

以下是我所知道和遇到过的选项,请想象一下void do_something(uint32_t bla)存在签名的函数.

1: enum class

枚举类是作用域的,但不能隐式转换为整数.我发现重要的是我没有static_cast它到一个整数,所以这似乎不合适.

enum class Foo : uint32_t
{
    BAR = 0x0000,
    BAZ = 0x0001
};

do_something(Foo::BAR) // Illegal, I'd have to `static_cast` here
Run Code Online (Sandbox Code Playgroud)

2: enum

常规的C样式枚举可以隐式转换为整数,但不是作用域(并污染它所在的命名空间).这是一个为什么我发现这对我的用例不合适的例子:

enum Foo : uint32_t
{
    BAR = 0x0000,
    BAZ = 0x0001
}

do_something(Foo::BAR) // Legal, and what I am looking for
do_something(BAR)      // Legal, whilst I don't want this to be possible
Run Code Online (Sandbox Code Playgroud)

3:命名空间 enum

这有效,但如果我在某个地方遇到这个,我会挑起眉毛.有些东西告诉我可能有更好的方法

namespace Foo
{
    enum dontcare : uint32_t
    {
        BAR = 0x0000,
        BAZ = 0x0001
    };
}

do_something(Foo::BAR) // Legal, and what I am looking for
do_something(BAR)      // Illegal, just like I want it to be
Run Code Online (Sandbox Code Playgroud)

4:命名空间 static constexpr

虽然这样做我想要的,但我再次(就像命名空间一样enum)感觉必须有更好的方法.

namespace Foo
{
    static constexpr uint32_t BAR = 0x0000,
    static constexpr uint32_t BAZ = 0x0001
}

do_something(Foo::BAR) // Legal, and what I am looking for
do_something(BAR)      // Illegal, just like I want it to be
Run Code Online (Sandbox Code Playgroud)

总而言之,是否有更好的方法,或者我必须坚持命名空间enum或命名空间constexpr

And*_*dyG 2

您可以通过将 a 与嵌套的匿名枚举混合来破解您自己的作用域枚举struct(编辑:我猜枚举本身不必匿名的):

struct Foo{
    enum: uint32_t
    {
        BAR = 0x0000,
        BAZ = 0x0001
    };
};
Run Code Online (Sandbox Code Playgroud)

现场演示

根据 C++11 语义 ([dcl.enum]),它不是一个作用域枚举,但它至少是一个作用域为类的枚举Foo。它可以按照您想要的方式使用,而不会污染全局名称空间:

do_something(Foo::BAR);
Run Code Online (Sandbox Code Playgroud)