我有一个关于enums和enum classs 的不同形式的问题,特别是指定了大量(作用域!)常量.
我想知道是否有办法声明一个scoped enum,它可以隐式转换为整数.用于此的用例是指定寄存器地址并能够使用类似的方式访问它们MY_REGISTERS::FOO.
以下是我所知道和遇到过的选项,请想象一下void do_something(uint32_t bla)存在签名的函数.
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)
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)
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)
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?
您可以通过将 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)