雪千渔Blog

  • 首页
  • 写写代码
    • dotNet
    • C++
    • Lua
    • Visual Basic
    • Java
    • Android
    • Web
  • DCC
    • Maya
    • Maya-Plug
    • AfterEffect
    • AfterEffect-Plug
    • PhotoShop-Plug
  • 游戏制作
    • Unity3D
    • UnrealEngine
    • 经验杂谈
    • 游戏设计
    • 自研引擎
    • 效果实现
  • 其他
    • 乱七八糟
    • 软件工具
    • 留言板
    • 自制素材
    • 关于我
雪千渔blog
唯有热爱,能抵漫长岁月
  1. 首页
  2. Coding
  3. C++
  4. 正文

c++之枚举类的位运算定义

2022年6月22日 1221点热度 0人点赞 0条评论

在c++11开始引入了枚举类型enum class,在此之前enum关键字所声明的枚举更像是一个普通的常量集合,会将当前作用域视为访问空间,而enum class解决了这一问题。但作为类型也失去了像数字一样的于运算,尤其在使用Flags时会尤为困难,这里将会编写宏定义,自动生成完成运算符的重载。

enum class可以有一个明确的类型,可以是int32_t、int64_t等等,在运算符时要将枚举强制转换回本身整数类型时才可以进行运算,这里将会使用标准库提供的std::underlying_type_t(cppreference),即std::underlying_type_t<Enum>

#pragma once

#define ENUM_CLASS_FLAGS(Enum) \
inline constexpr Enum& operator|=(Enum& x, Enum y) { \
    return x = static_cast<Enum>( \
        static_cast<std::underlying_type_t<Enum>>(x) | static_cast<std::underlying_type_t<Enum>>(y) \
); } \
inline constexpr Enum& operator&=(Enum& x, Enum y) { \
    return x = static_cast<Enum>( \
        static_cast<std::underlying_type_t<Enum>>(x) & static_cast<std::underlying_type_t<Enum>>(y) \
); } \
inline constexpr Enum& operator^=(Enum& x, Enum y) { \
    return x = static_cast<Enum>( \
        static_cast<std::underlying_type_t<Enum>>(x) ^ static_cast<std::underlying_type_t<Enum>>(y) \
); } \
inline constexpr Enum operator| (Enum x, Enum y) { \
    return static_cast<Enum>( \
        static_cast<std::underlying_type_t<Enum>>(x) | static_cast<std::underlying_type_t<Enum>>(y) \
); } \
inline constexpr Enum operator& (Enum x, Enum y) { \
    return static_cast<Enum>( \
        static_cast<std::underlying_type_t<Enum>>(x) & static_cast<std::underlying_type_t<Enum>>(y) \
); } \
inline constexpr Enum operator^ (Enum x, Enum y) { \
    return static_cast<Enum>( \
        static_cast<std::underlying_type_t<Enum>>(x) ^ static_cast<std::underlying_type_t<Enum>>(y) \
); } \
inline constexpr bool operator! (Enum x) { \
    return !static_cast<std::underlying_type_t<Enum>>(x); \
} \
inline constexpr Enum operator~ (Enum x) { \
    return static_cast<Enum>(~static_cast<std::underlying_type_t<Enum>>(x)); \
}

template<typename Enum>
inline constexpr bool EnumHasFlag(Enum a, Enum b)
{
    return static_cast<bool>( static_cast<std::underlying_type_t<Enum>>(a & b) );
}

同时对于if来说该枚举值是无法直接使用的,最后添加一个EnumHasFlag来帮助枚举位运算。

枚举属于编译期的常量,靠编译期的常量计算与内联可以忽略该定义所带来的开销。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: cpp
最后更新:2022年6月23日

JomiXedYu

IndieGame Developer & Netease Games TechArt

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

JomiXedYu

IndieGame Developer & Netease Games TechArt

最新 热点 随机
最新 热点 随机
UE材质Custom节点与HLSL的HACK操作 UE5出现D3D12崩溃报错解决方案 游戏引擎脚本绑定的三种写法与利弊 一种解决不支持中文与空格文件名的编码 Vulkan坐标系通用方案以及反转viewport UE编辑器开发之蓝图篇
一种解决不支持中文与空格文件名的编码游戏引擎脚本绑定的三种写法与利弊UE5出现D3D12崩溃报错解决方案UE材质Custom节点与HLSL的HACK操作
Adobe Prelude,Pr,AE影视合成/剪辑更有效率的制作 Maya崩溃文件查看器实用小工具发布 Key社咖啡贴图psd C# using引用别名的使用方式 游戏引擎脚本资产化与自研引擎实现的思考 VB.NET外部程序的编译
友情链接
  • DorinXL
  • 小博博客
  • 秋橘斋

COPYRIGHT © 2014-2023 雪千渔Blog. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

辽ICP备20006894号-1