通过重载运算符输出强类型枚举的值

news/2024/12/26 14:39:56/文章来源:https://www.cnblogs.com/BryceAi/p/18632781

通过重载运算符输出强类型枚举的值

例子摘自《现代C++教程:高速上手 C++11141720》

对于下面的枚举类型:

enum class NEW_ENUM : unsigned int 
{a,b,c,d = 100,e = 100
};

我们可以通过重载运算符输出枚举的值:

template <typename T>
std::ostream& operator << (typename std::enable_if<std::is_enum<T>::value, std::ostream >:: type& stream , const T& e)
{return stream << static_cast<typename std::underlying_type<T>::type>(e);
}

这样我们就可以通过下面的代码输出枚举的值:

std::cout << NEW_ENUM::a << std::endl;

解释重载过程:

  • template <typename T>
    • 定义一个模板函数,模板参数为类型T。这是为了支持任意类型的枚举。
  • std::ostream& operator << (typename std::enable_if<std::is_enum<T>::value, std::ostream >:: type& stream , const T& e)
    • SFINAE(Substitution Failure Is Not An Error)技术是C++模板元编程中的一个技术。这个技术的核心思想是:如果一个模板函数在实例化时,无法通过编译,那么编译器不会报错,会根据具体的情况选择另一个重载的函数。(个人的一个通俗的理解,如果通过SFINAE机制的函数不满足条件,那么就忽略这个函数。)
    • std::ostream&:返回值为输出流对象的引用。这是为了支持连续输出。
    • operator <<:重载输出运算符。
    • std::enable_if<std::is_enum<T>::value, std::ostream >:: type:这是一个模板元函数,用于判断T是否为枚举类型。如果是枚举类型,返回std::ostream类型,否则返回void。这是为了限制只有枚举类型才能调用这个函数。
      • std::enable_if:模板元函数。这个函数是一个模板函数,有两个模板参数:一个是bool类型的值,另一个是返回值类型。如果第一个参数为true,则返回第二个参数类型,否则返回void。
      • std::is_enum<T>::value:判断T是否为枚举类型。如果是枚举类型,返回true,否则返回false。
      • std::ostream:返回值类型。
      • :: type:返回值类型。
      • stream:输出流对象。是这个函数的第一个参数。表示重载的输出运算符左边的对象。
      • const T& e:枚举对象。是这个函数的第二个参数。表示重载的输出运算符右边的对象。
  • return stream << static_cast<typename std::underlying_type<T>::type>(e);
    • 返回输出流对象。
    • stream << static_cast<typename std::underlying_type<T>::type>(e):输出枚举的值。
      • stream:输出流对象。
      • <<:输出运算符。
      • static_cast<typename std::underlying_type<T>::type>(e):将枚举对象转换为枚举的底层类型。
        • static_cast:类型转换运算符。静态类型转换,不会进行运行时检查。
        • std::underlying_type<T>:获取枚举类型T的底层类型。注意这里的T是枚举类型,不是枚举对象。
        • typename std::underlying_type<T>::type:这里tpyename是一个关键字,表示std::underlying_type<T>::type是一个类型。std::underlying_type<T>::type是枚举类型T的底层类型。
        • 整体的逻辑是:将枚举对象转换为枚举的底层类型,然后输出这个值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/859306.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

19款顶级测试用例管理工具全面解析

在当今数字化飞速发展的时代,软件测试的重要性日益凸显,而一款优秀的测试用例管理工具能够极大地提升测试效率与质量,帮助团队更高效地发现软件中的问题,确保产品的稳定性和可靠性。本文将为您全面解析19款顶级的测试用例管理工具,带您深入了解它们的特点与优势,助您在众…

OCR实践-Table-Transformer

前言 书接上文OCR实践—PaddleOCRTable-Transformer 与 PubTables-1M table-transformer,来自微软,基于Detr,在PubTables1M 数据集上进行训练,模型是在提出数据集同时的工作, paper PubTables-1M: Towards comprehensive table extraction from unstructured documents,发…

新能源汽车门店运营优化:项目管理工具的实践与探索

项目管理工具通过优化任务管理、增强团队协作、提升资源利用效率以及加强数据分析与决策支持等多个方面,显著提升了新能源汽车门店的运营效率。门店管理者应充分利用这些工具的功能和优势,不断优化门店的运营流程和管理方法,以应对日益激烈的市场竞争。项目管理工具在新能源…

摆线的参数方程

建立两个平面直角坐标系,一个是固定系\(O\),另一个是不定系\(O\),二者初始状态完全重合,置于一个半径为\(R\)的圆,圆上取其一点v\(\begin{pmatrix} 0& -R\end{pmatrix}^T\)旋转与平移矩阵——左乘矩阵 矢量u应升级为\(\begin{pmatrix} x& y&1\end{pmatrix}^…

vs2022 web项目F5调试停止后阻止浏览器自动关闭

默认停止调试会自动关掉swagger页面,如何不关闭?取消如图箭头所指向的勾选. 但是会导致每次F5会打开一个新的swagger: launchSettings.json中修改 "launchBrowser": false, 即可. 唯一不方便是第一次调试时,需要手动在浏览器里输入swagger地址.作者:xuejianxiyang出…

idea恢复文件,666

右击文件-Local History

HTML实现一个脱离video标签可拖拽的进度控制条

HTML实现一个脱离video标签可拖拽的进度控制条 主要用到html5的 input range 标签。 <!DOCTYPE html> <html> <body><video id="myVideo" width="320" height="240"><source src="http://***.com/record/st-ec-…

Windows交叉编译MNN-3.0.0安卓版本库(通过WSL2)

一、写在前面 昨天写了在WIN10上面通过Andriod Studio来编译MNN的demo,通过解压.apk文件来得到libMNN.so文件。今天在记录一下使用WSL2来编译MNN-Andriod。 二、WSL2的安装 由于不是本篇的主题,故不在这里进行展开,后续会补充步骤链接。 三、WSL2编译环境配置 1、NDK-Linux安…

再战博客园美化(四)

书接上回 上回提到,博客园的美化实现了vue,并且实现了黑暗模式,现在已经进入到自己美化的地步了。 虽然感觉和安全之路越来越远,不过也是一种体验。 目前的问题现在这个边角有点生硬,不够淡雅。 应该是gpt帮我生成的边角,我试试他原有的样子如何。误会了,它原本的边角就…

【开源】绿联145W能量π外壳

绿联这个移动电源做工和能量还是给力的,但是最近有一个Type-C口既不能充也不能放了,拆解过程非常痛苦,外壳扣太紧了,最后狠下心破坏性拆解掉。电源板是双层堆叠的,拆开上板再插回去后那个坏掉的口子居然复活了。先前可能是内部电路出了什么问题,芯片进入了锁死的状态。接…

基本数据结构——算法学习(三)上

数据结构——算法学习(三)上前言 数据结构是计算机科学的基石,几乎所有的软件开发、算法设计都离不开对数据的组织与管理。它不仅是程序高效运行的保障,也是解决复杂问题的关键工具。学习数据结构的过程,不仅仅是掌握具体的知识点,更是培养逻辑思维能力和问题解决能力的重…

电脑永久免费云存储空间,什么是云存储

在当今全球化的背景下,远程连接技术的重要性愈发凸显。它使得分布在世界各地的团队成员能够实时协作,共享资源,共同推进项目的进展。无论是跨国公司的远程办公,还是国际学术研究中的数据共享,远程连接都发挥着关键的作用,促进了信息的流通和知识的传播。这次给大家介绍什…