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

在以前的代码库中,我有:

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
}


以上是重构为枚举以枚举类阴影命名空间的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>