You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++强类型枚举(Scoped enums)转换问题:存入vector<int>得到字符值

解决enum class转int推入vector得到字符值的问题

嘿,这个坑我之前踩过!问题的核心在于enum class是强类型枚举,它和普通enum不一样,不会隐式转换成int类型。你之所以得到字符值,大概率是在转换枚举值的时候不小心转成了char,或者因为枚举值的数值刚好对应某个ASCII字符,让你误以为推入的是字符(其实是字符的ASCII码值)。

先看你可能犯的错误示例

比如你可能写了类似这样的代码:

enum class MyEnum { Option1 = 65, Option2 = 66 }; // 65是'A'的ASCII码,66是'B'

vector<int> v;
vector<char> t;

MyEnum val = MyEnum::Option1;
switch(val) {
    case MyEnum::Option1:
        v.push_back(static_cast<char>(val)); // 错误:转成char后再推int,实际是65('A'的ASCII)
        t.push_back('A');
        break;
    case MyEnum::Option2:
        v.push_back(static_cast<char>(val)); // 实际是66('B'的ASCII)
        t.push_back('B');
        break;
}

这时候v里存的是65、66,看起来就像对应的字符值,但本质是你错误地把枚举值转成了char类型。

正确的解决方法

1. 显式转换为int类型

强类型枚举必须用static_cast<int>()来显式转换,这样才能把枚举的底层数值正确推入vector

switch(val) {
    case MyEnum::Option1:
        v.push_back(static_cast<int>(MyEnum::Option1)); // 正确:推入的是65(枚举的int值)
        t.push_back('A');
        break;
    case MyEnum::Option2:
        v.push_back(static_cast<int>(MyEnum::Option2)); // 正确:推入的是66
        t.push_back('B');
        break;
}

这样v里存的就是你定义的枚举int值,不会再出现看起来像字符的数值。

2. 通用转换辅助函数(可选)

如果你的代码里经常需要把enum class转成底层类型,可以写一个通用的辅助函数,兼容不同底层类型的枚举(比如你如果把enum class的底层类型设为short也能正常工作):

#include <type_traits> // 需要包含这个头文件

template<typename Enum>
constexpr auto to_underlying(Enum e) noexcept -> std::underlying_type_t<Enum> {
    return static_cast<std::underlying_type_t<Enum>>(e);
}

// 使用方式
v.push_back(to_underlying(MyEnum::Option1));

这个函数用std::underlying_type_t自动获取枚举的底层类型,比直接写static_cast<int>()更灵活。

总结一下

enum class的强类型特性就是为了防止隐式转换带来的意外错误,所以一定要显式转换成你需要的int类型,别误转成char。只要修正转换的类型,就能得到你想要的枚举int值啦!

内容的提问来源于stack exchange,提问作者UserX

火山引擎 最新活动