首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C++惯用法之enum class

C++惯用法之enum class

作者头像
公众号guangcity
发布2019-12-16 11:59:14
发布2019-12-16 11:59:14
2.3K0
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

C++惯用法之enum class

在Effective modern C++中Item 10: Prefer scoped enums to unscoped enum,调到要用有范围的enum class代替无范围的enum。

例如:

代码语言:javascript
复制
enum Shape {circle,retangle};
auto circle = 10;  // error

上述错误是因为两个circle在同一范围。对于enum等价于:

代码语言:javascript
复制
#define circle 0
#define retangle 1

因此后面再去定义circle就会出错。

所以不管枚举名是否一样,里面的成员只要有一致的,就会出问题。例如:

代码语言:javascript
复制
enum A {a,b};
enum B {c,a};

a出现两次,在enum B的a处报错。

根据前面我们知道,enum名在范围方面没有什么作用,因此我们想到了namespace,如下例子:

代码语言:javascript
复制
// 在创建枚举时,将它们放在名称空间中,以便可以使用有意义的名称访问它们:
namespace EntityType {
    enum Enum {
        Ground = 0,
        Human,
        Aerial,
        Total
    };
}

void foo(EntityType::Enum entityType)
{
    if (entityType == EntityType::Ground) {
        /*code*/
    }
}

将命名空间起的有意思点,就可以达到想要的效果。

但是不断的使用命名空间,势必太繁琐,而且如果我不想使用namespace,要达到这样的效果,便会变得不安全,也没有约束。

因此在c++11后,引入enum class。

enum class 解决了为enum成员定义类型、类型安全、约束等问题。回到上述例子:

代码语言:javascript
复制
// enum class
enum class EntityType {
    Ground = 0,
    Human,
    Aerial,
    Total
};

void foo(EntityType entityType)
{
    if (entityType == EntityType::Ground) {
        /*code*/
    }
}

这便是这一节要阐述的惯用法:enum class。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++惯用法之enum class
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档