当前位置: 首页 > news >正文

迁安市住房和城乡建设局网站wordpress个性化

迁安市住房和城乡建设局网站,wordpress个性化,福州培训网站建设,系统构建C语言风格枚举类型 enum 这是一个enum类型 enum LogType {OK,Info,Error };可以像这样指定enum的基础类型(默认类型是int),用英文来说就是underlying type enum LogType : unsigned int {OK,Info,Error };继续升级,指定每个枚举…

C语言风格枚举类型 enum


这是一个enum类型

enum LogType {OK,Info,Error
};

可以像这样指定enum的基础类型(默认类型是int),用英文来说就是underlying type

enum LogType : unsigned int {OK,Info,Error
};

继续升级,指定每个枚举元素具体的值

enum LogType : unsigned int {OK = 0x00,Info = 0x01,Error = 0x02
};

经典位掩码,即Bitmask写法

enum WindowFlags : unsigned int {None = 0x0000,NoMove = 0x0001,NoResize = 0x0002,NoSavedSettings = 0x0004
};
auto MySettings = NoMove | NoResize;

但是enum本质上其实是无范围枚举,即unscoped enumeration,很容易就会发现命名冲突问题

enum LogType {OK,Info,Error
}; // OKenum StatusCode {OK,Forbidden
}; // OK?auto res = LogType::OK; // Compiler doesn't know which OK to use even using :: to specify

想要解决这个问题并不难,我们可以外面套一层struct或者class

struct LogType {enum {OK,Info,Error};
};class StatusCode {enum {OK,Forbidden};
};auto res = LogType::OK; // OK!

但是这样似乎不太优雅,尤其是我们想将enum作为函数返回值的时候

struct StatusCode {enum {OK,Forbidden};
};StatusCode foobar() {return StatusCode::OK; // Hey, don't do this!
};

C++风格枚举类型 enum class

为了解决以上种种问题,C++引入了enum class,这是一种范围枚举,即scoped enumeration,不存在命名冲突
用法和enum相似,无非就是在后面添加了一个struct或者class(等效)

enum struct LogType {OK,Info,Error
};enum class StatusCode {OK,Forbidden
};

我们也可以像enum一样把enum class类型作为函数返回值(可以把它看作是一个类)

enum class StatusCode {OK,Forbidden
};StatusCode foobar() {return StatusCode::OK;
};

值得注意的是,enum class并不支持隐式类型转换,即implicit type conversion
因此,enum class也并不能像enum那样直接进行位运算

enum class WindowFlags : unsigned int {None = 0x0000,NoMove = 0x0001,NoResize = 0x0002,NoSavedSettings = 0x0004
};WindowFlags foobar() {return WindowFlags::None;
};
if (!foobar())exit(EXIT_FAILURE); // g++: expression must have bool type (or be convertible to bool)
auto MySettings = NoMove | NoResize; // g++: no operator "|" matches these operands
auto MySettings = static_cast<WindowFlags> (static_cast<unsigned int> (WindowFlags::NoMove) | static_cast<unsigned int> (WindowFlags::NoResize)); // OK

显示类型转换,即explicit type conversion似乎过于臃肿,但是我们可以重载一下enum class相关的operator,以下模板放在我们的enum class的命名空间内即可(具体细节此处不赘述,请自行查阅std::enable_if_t, std::is_enum_v)

template <typename enum_type, typename cast_type = std::size_t>
constexpr std::enable_if_t<std::is_enum_v<enum_type>, enum_type> operator& (enum_type x, enum_type y) {return static_cast<enum_type>(static_cast<cast_type> (x) & static_cast<cast_type> (y));
}template <typename enum_type, typename cast_type = std::size_t>
constexpr std::enable_if_t<std::is_enum_v<enum_type>, enum_type> operator| (enum_type x, enum_type y) {return static_cast<enum_type>(static_cast<cast_type> (x) | static_cast<cast_type> (y));
}template <typename enum_type, typename cast_type = std::size_t>
constexpr std::enable_if_t<std::is_enum_v<enum_type>, enum_type> operator^ (enum_type x, enum_type y) {return static_cast<enum_type>(static_cast<cast_type> (x) ^ static_cast<cast_type> (y));
}template <typename enum_type, typename cast_type = std::size_t>
constexpr std::enable_if_t<std::is_enum_v<enum_type>, enum_type> operator~ (enum_type x) {return static_cast <enum_type> (~static_cast<cast_type> (x));
}template <typename enum_type, typename cast_type = std::size_t>
constexpr std::enable_if_t<std::is_enum_v<enum_type>, enum_type> operator&= (enum_type &x, enum_type y) {x = x & y;return x;
}template <typename enum_type, typename cast_type = std::size_t>
constexpr std::enable_if_t<std::is_enum_v<enum_type>, enum_type> operator|= (enum_type &x, enum_type y) {x = x | y;return x;
}template <typename enum_type, typename cast_type = std::size_t>
constexpr std::enable_if_t<std::is_enum_v<enum_type>, enum_type> operator^= (enum_type &x, enum_type y) {x = x ^ y;return x;
}

enum class严格意义上来说并不是一个常规意义上的class,所以无法通过重载自动转换为bool类型,但是我们可以手写一个any函数来判断位掩码

template <typename enum_type, typename cast_type = std::size_t>
constexpr std::enable_if_t<std::is_enum_v<enum_type>, bool> any(enum_type x) {return static_cast<cast_type> (x) == 0;
};

简单样例(已载入上述模板)

enum class WindowFlags : unsigned int {None = 0x0000,NoMove = 0x0001,NoResize = 0x0002,NoSavedSettings = 0x0004
};auto MySettings = WindowFlags::NoMove | WindowFlags::NoResize;if (any(MySettings)) { // To check if any flags are set/* do something */
}

参考链接

cppreference.com

http://www.dtcms.com/a/412737.html

相关文章:

  • 买网站需要多少钱智控系统
  • 找事情做的网站中国建设银行网站缺点
  • 深圳北斗部标平台网站建设温州高端网站建设公司哪家好
  • 网站查询域名郑州网络
  • 网站的c4d动画是怎么做的python 网站开发怎么部署
  • 有趣的网站名方林装饰公司电话
  • 上线倒计时单页网站模板网站建设有免费的吗
  • 阿里云网站建设模板wordpress 写博客插件
  • 网站设计前景河北省住房和城乡建设厅网站官网
  • 网站建设都会用到哪些建站工具微信小程序开发视频完整教程
  • 网站建设 图片问题纯手工建网站
  • 网站移动适配网站加alt属性对优化有影响吗
  • 做网站 工商 非法经营wordpress导入网页
  • 网站开发的付款方式进入淘宝网官网首页 淘宝
  • Tailwind CSS 入门指南
  • 绍兴网站定制公司专门做三国战纪的网站叫什么意思
  • 做网站公司汉狮网络wordpress标题都是大写
  • 内页网站地图 权重wordpress默认文章模式
  • 外贸营销型网站策划中seo层面包括四川做网站的公司有哪些
  • 专门做餐厅设计的网站网站别人做的我自己怎么续费
  • 做网站赚钱交税凡科建站登录界面
  • 关于网站开发的外文翻译青岛制作网站企业
  • 干净的下载网站新网站必须做301定向吗
  • 徐州品牌网站建设怎么创建一个公众号
  • 中英文双语网站 滑动切换建筑网络计划图
  • 开原网站网站建设摄影师的网站有哪些
  • 一级a做爰网站中国免费下载ppt模板网站有哪些
  • Python图书大数据平台 requests爬虫+Echarts+ Django当当图书数据分析大屏 爬虫+清洗+可视化 ✅
  • 134. 加油站
  • php做网站如何织梦搭建商城网站