C++ enum class转常量

当使用 enum class 时,它具有更强的类型安全性和隔离性,因此需要显式转换才能访问其底层整数值。
std::underlying_type_t 是一个类型别名,它返回枚举类型的底层类型。
to_underlying 函数提供了一种方便的方式来执行这种转换,特别是在需要频繁进行此类转换的情况下。

#include <type_traits>
#include <utility>
#include <cstdint>
#include <iostream>

template<class T, std::enable_if_t<std::is_enum_v<T>, int> = 0>
constexpr std::underlying_type_t<T> to_underlying(T t) noexcept
{
    return static_cast<std::underlying_type_t<T>>(t);
}

template<class R, class T, std::enable_if_t<std::is_enum_v<R>, int> = 0,
    std::enable_if_t<!std::is_enum_v<T>, int> = 0>
constexpr R to_underlying(R& val, T t) noexcept
{
    using UnderlyingType = std::underlying_type_t<R>;
    UnderlyingType underlyingColor = static_cast<UnderlyingType>(t);
    val = static_cast<R>(underlyingColor);
    return val;
}

template<class T, std::enable_if_t<!std::is_enum_v<T>, int> = 0>
constexpr T to_underlying(T t) noexcept
{
    return t;
}


void test() {
    enum class E : std::uint8_t { A = 0, B, C };   
    int x = to_underlying(E::B);
    int x1 = to_underlying(E::A);
    std::cout << x << "," << x1 << std::endl;
}

输出: 1,0


创作不易,小小的支持一下吧!

C++ 中,`enum` 和 `enum class` 是两种用于定义枚举类型的关键词,但它们之间有一些关键的区别: 1. **作用域**: - `enum`: 它没有内置的作用域限制,如果在同一文件或命名空间内有重复的枚举常量名,可能会导致编译错误或不明确的行为。如果你希望避免这种情况,通常使用全限定名称(如 `namespace::EnumName`)。 - `enum class`: 这种枚举类型是类(class),因此它的值被隐式地封装在一个私有的命名空间中,保证了枚举常量在整个程序中的唯一性。 2. **默认整型存储**: - `enum`: 当没有指定基础类型时,默认是 `int`。这意味着枚举值会从0开始,例如 `enum Color { Red, Green, Blue }` 的 Red 将被存储为0、Green为1、Blue为2。 - `enum class`: 默认也是 `int` 类型,但它可以显式指定基础类型,如 `enum class Color : unsigned char { Red = 1, Green = 2, Blue = 3 }`,这里 `Color` 的取值范围将是 `0` 到 `255`。 3. **类型安全**: - `enum`: 只能进行 `enum` 值之间的比较,不能与其他类型直接进行比较,这可能导致意外的结果。 - `enum class`: 具有更好的类型安全,你可以像处理其他基本数据类型一样操作 `enum class`,比如 `Color red = Color::Red;`。 4. **赋值行为**: - `enum` 的值是可以修改的(除了可能的枚举常量)。例如,`Red = 7` 后,Red 的值变成了7。 - `enum class` 不支持成员赋值,一旦声明就不能改变其值,这是枚举类的一个优点,因为它确保了枚举值的不变性。 总结来说,`enum class` 提供了一种更现代和类型安全的方式来定义枚举,尤其是在大型项目中,能够避免潜在的命名冲突和意外的整数值修改。而 `enum` 在某些简单的场景下可能更为方便,尤其是当你不需要完全的类型安全和作用域控制时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码力码力我爱你

创作不易,小小的支持一下吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值