zoukankan      html  css  js  c++  java
  • Enum , Enum Class ?

    使用Enum还是Enum Class?

    根据Enum和Enum Class的特点,我们可以根据对常量类型的要求决定使用Enum还是Enum Class。

    以下场景适合使用Enum:

    • 常量类型用于内部表示,不用于显示名字。
    • 常量值不需要提供附加的属性。例如只需要知道国家代码,而不需要获得国家的其它属性
    • 枚举值允许组合(即支持位操作)。

    Enum Class可以适用于更多的场景:

    • 常用于可提供友好信息的类型。如本地化支持的类型名显示,或者显示与枚举名不一致的名字,例如Country.CHN可显示为"China"。
    • 提供更多的常量属性。
    • 提供更加丰富的行为。如Parse方法。
    • 对常量进行分组。如Country.Asia包含亚洲国家。

    使用Struct来表示枚举

    如果值域不封闭,但希望提供一些常量,也可以使用struct,如System.Drawing.Color结构中的系统默认颜色设置。采用struct来设计enum值同Enum Class方式没有本质的差异,只是struct默认提供无参数构造函数,因此无法实现封闭值域。

    任何希望精通C++的人,其实都应该认真的阅读C++的标准文档,而不是只看别人写的书,第一手资料,特别是标准文档永远都是不可替代的。然后才是其他的书籍帮助更深的理解这些标准。

    提供这个enum class的原因是因为旧的enum有不少缺点。简单描述一下:

    1. 容易被隐式转换成int

    2. underlying type 指的是编译器实现者幕后的实现细节导致了跨平台,跨编译器的不一致性。尺寸的不可估计等等。

    3. 没有严格的scope界限

    文档中还分析了试图解决以上问题的方法,但是最终都因为有各自的缺陷,还是创造了enum class来解决。技术总是不断的发展,enum class今天看解决了过去的问题,或许不久又会发现其还有缺点。:)

    下面我写了一个例子:

    #ifndef BEAN_REST_CODE_H_
    #define BEAN_REST_CODE_H_
    
    enum class RestCode { OK, ADD_CPU_ERROR };
    
    #endif

    松了一口气,幸亏没有搞得像Java的Enum那么复杂。

    现在不能隐式转换成int了,那么如果我真的需要这样做怎么办?比如序列化到流里面。用underlying_type。来自stackoverflow一个帖子,据说这个代码又来自某开源库。

    #ifndef HELPER_ENUM_HELPER_H_
    #define HELPER_ENUM_HELPER_H_
    
    template <typename Enumeration>
    auto as_integer(Enumeration const value)
    -> typename std::underlying_type<Enumeration>::type
    {
    return static_cast<typename std::underlying_type<Enumeration>::type>(value);
    }
    
    #endif

    至于语法怎么用,文档中有详细描述。仔细阅读吧。

  • 相关阅读:
    dynamic debug动态打印
    leetcode:Pascal's Triangle II (杨辉三角形,空间限制)【面试算法题】
    HDU 1671 Phone List 二叉树水题 数组建树法
    栈和队列
    一张图理解O(1)算法
    uva 10608
    C# 写的工作任务 Job 定时调度框架 WebWork (Quartz.NET) Web版的Windows服务
    PHP伪造referer突破防盗链
    php 文件上传一例简单代码
    PHP 图片文件上传代码
  • 原文地址:https://www.cnblogs.com/icmzn/p/5406887.html
Copyright © 2011-2022 走看看