重构为枚举到枚举类阴影命名空间

问题描述

在以前的代码库中我有

namespace E {
enum { a,b }
void foo();
}

我想重构为使用 enum class

enum class E : int { a,b }
namespace E {
void foo();
}

然而,这无法编译,因为现在不能使用 namespace E,因为它与 enum 同名。 有没有解决的办法 ? 基本上我仍然希望调用代码按原样编译,它使用 E::foo()E::a

解决方法

另一种方法是定义一个枚举类,然后将其值映射到相应的常量:

namespace E {
    enum class MyEnum { a,b };
    constexpr auto a = MyEnum::a;
    constexpr auto b = MyEnum::b;

    void foo() {}
}

https://godbolt.org/z/zY5v3G

这种方式将引入强类型检查,并且不必更改依赖代码。更多类型,但不需要 C++20,它可以使用 C++11。

,

基本上我仍然希望调用代码按原样编译,即使用 E::foo() 或 E::a

不,你不能这样做,enum class 的优点之一是不会污染外部命名空间。另一个是没有隐式转换。

从 C++20 开始,可以使用 using enum E;

显式请求名称注入
enum class E : int { foo,bar };

using enum E;

int main()
{
    E x = foo; // Now works
    E y = E::bar; // Still works
}