C 示波器的枚举是隐式转换为整数的

C++ scoped enums that are implicitly convertable to integers

本文关键字:转换 整数 示波器 枚举      更新时间:2023-10-16

我对enum S和enum class的不同形式有一个疑问,专门用于指定大量(scoped!)常数。

我想知道是否有一种方法可以声明A 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

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

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

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

因此,总的来说,有没有更好的方法来解决这个问题,或者我必须坚持使用命名级的enum S或名称为constexpr S?

您可以通过将struct与嵌套的匿名枚举混合(编辑:我想枚举本身没有)来破解自己的范围枚举。:

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

实时演示

根据c 11语义([dcl.enum]),它不是范围的枚举,但它至少是一个被范围范围为 Foo类的枚举。它是可以使用的,就像您想要的方式一样,不污染全局名称空间:

do_something(Foo::BAR);