【问题标题】:Is there a way to update enum variables with new states in C++?有没有办法用 C++ 中的新状态更新枚举变量?
【发布时间】:2020-11-08 18:37:34
【问题描述】:

我想知道是否有办法在 C++ 中更新枚举变量,从而动态地为程序提供新状态。例如,我为星期几创建了一个 void 枚举变量,然后,我想让用户输入日期来更新枚举变量。

【问题讨论】:

  • 不,必须在编译时定义枚举。
  • 枚举的要点是有一个不同的类型,其标识符可以用于源代码中的不同值。因此,考虑在运行时(当用户可以输入内容时)向枚举添加新标识符 - 比如说 Tuesday - 是没有意义的 - 因为代码已经被编译(你不能使用Tuesday 因为它在枚举定义中不存在)。
  • 扩展枚举是一个总是以良好的意图开始的概念,然后为以后必须处理它的任何人制造混乱。我觉得很幽默,甚至 python 也通过了扩展枚举。所以,不要这样做。想想你试图解决更多的问题。希望有更好的解决方案能自行揭晓。
  • 我认为这是一个 XY 问题,如果讨论可能会有一个干净和更好的解决方案。

标签: c++ types enums set


【解决方案1】:

例如,我为星期几创建了一个 void 枚举变量,然后,我想让用户输入日期来更新枚举变量。

不,这不是枚举在 C++ 中的工作方式。它们只是一组固定的可数值表示的值,而该组在编译时已完全定义。

枚举值:

  • 必须在编译时完全定义(全部)
  • 无法在运行时使用新引入的值进行扩展
  • 没有作为人类可读文本的标准表示

您需要的是用户输入(假设是字符串数据)和预定义枚举值之间的映射,例如像

enum class Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };

std::string Weekday2String(Weekday wd) {
    switch(wd) {
         case Weekday::Monday: return "Mon";
         case Weekday::Tuesday: return "Tue";
         case Weekday::Wednesday: return "Wed";
         case Weekday::Thursday: return "Thu";
         case Weekday::Friday: return "Fri";
         case Weekday::Saturday: return "Sat";
         case Weekday::Sunday: return "Sun";
    }
    throw std::exception("Unexpected enum value.")
}

Weekday string2Weekday(const std::string& input) {
    if(input == "Mon") { return Weekday::Monday; }
    if(input == "Tue") { return Weekday::Tuesday; }
    if(input == "Wed") { return Weekday::Wednesday; }
    if(input == "Thu") { return Weekday::Thursday; }
    if(input == "Fri") { return Weekday::Friday; }
    if(input == "Sat") { return Weekday::Saturday; }
    if(input == "Sun") { return Weekday::Sunday; }
    throw std::exception("Invalid weekday string.")
}

您可以在需要从用户界面输入工作日的例程中使用这些函数。


注意:

  • 有更复杂的方法来定义上述函数(例如,作为管理Weekday 值的简单类的强制转换运算符定义,或std::ostream::operator<<()std::istream::operator>>() 的面向流的重载),但归根结底到最后。
  • 如果你想让它可配置,用户想为特定工作日输入什么(例如"povjaj"1 for Weekday::Tuesday),你必须将枚举封装到一个类中,它提供了为每个Weekday 值设置std::string 值,并将这些值保存在额外的变量中。

1)不幸的是,现在仍然没有适当的克林贡语到 Unicode 映射。

【讨论】:

    猜你喜欢
    • 2020-06-04
    • 2020-01-22
    • 2011-10-01
    • 1970-01-01
    • 2021-02-20
    • 2021-09-30
    • 2020-06-28
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多