问题描述
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() {}
}
这种方式将引入强类型检查,并且不必更改依赖代码。更多类型,但不需要 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
}