重构为枚举以枚举类阴影命名空间
在以前的代码库中,我有:
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
}