微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决重构为枚举到枚举类阴影命名空间

在以前的代码库中我有

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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。