【问题标题】:C++ Set enum class value according to two charsC++ 根据两个字符设置枚举类值
【发布时间】:2022-12-07 12:11:50
【问题描述】:

我在消息头中有一个字段表示消息类型。该字段是两个字符,如“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。

【问题讨论】:

  • @463035818_is_not_a_number 不幸的是不是因为我想使用枚举类所以我可以强制在任何 switch 语句中传递所有类型。
  • enum 只是一个 int,你可以定义一个静态字符串数组并使用 enum 作为索引。
  • 好的,但是我不明白什么是atoi("AR")"AR" 不是整数的字符串表示形式,atoi 会为这两个调用返回 0
  • @463035818_is_not_a_number 我相信 OP 想要“AR”的整数编码:std::uint16_t{'A'*256+'R'}。这将使用 std::uint16_t 作为枚举的基本类型与它们同步。
  • @bitmask 是的,我可以想象他们真正想要什么,但是他们用代码写的东西毫无意义;)。 @OP 请描述你想要什么。损坏的代码不能很好地解释它应该做什么,因为它只是损坏了

标签: c++ linux c++20


【解决方案1】:

好吧,这就是我的实现方式:

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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2011-11-14
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多