linux C++根据两个字符设置枚举类值

e0bqpujr  于 2022-12-11  发布在  Linux
关注(0)|答案(2)|浏览(136)

我在消息头中有一个表示消息类型的字段。该字段是两个字符,如“AR”。我想用一个枚举类来表示它,这样我就可以强制在switch语句中处理所有类型。
enum class中,我们会看到枚举的值是由两个char值定义的。但是,我很纠结,因为它必须是constexpr
这不能编译,但我在寻找这样的东西:

enum class AnEnum : uint16_t
{
    value_one = atoi(std::string("AR").c_str()),
    value_two = atoi(std::string("PF").c_str())
};

在上面的示例中,一个消息头包含字符AR,另一个消息类型包含PF。

8tntrjer

8tntrjer1#

我是这样实现的:

enum class E {
    AR = 0,
    PF = 1
};
static constexpr const char* ENUM_STRS[] = { "AR", "PF" };

void foo() {
    using std::cout;
    using std::endl;
    E e = E::PF;
    switch (e) {
    case E::AR:
        cout << ENUM_STRS[static_cast<int>(e)] << endl;
        break;
    case E::PF:
        cout << ENUM_STRS[static_cast<int>(e)] << endl;
        break;
    default:
        break;
    }
}
4c8rllxm

4c8rllxm2#

atoi将整数字符串表示形式转换为整数。"AR""PR"不是整数,因此atoi不是所需的。
多亏了位掩码,这才是你真正想要的:

enum class AnEnum : std::uint16_t
{
    value_one = std::uint16_t{'A'*256+'R'},
    value_two = std::uint16_t{'P'*256+'F'}
};

对于在消息中收到的字符串,您不需要在编译时转换它,因为该字符串只在运行时才知道。为了避免重复,在编译时使用它是很方便的,这样同样的转换可以用于枚举值。

constexpr std::uint16_t convert(const char x[2]) {
    return x[0]*256+x[1];
}

enum class AnEnum : std::uint16_t
{
    value_one = convert("AR"),
    value_two = convert("PF")
};

Complete Example

相关问题