有没有办法用C+;中的新状态更新枚举变量+;? 我想知道是否有一种方法来更新C++中的枚举变量,动态地赋予程序新的状态。例如,我为一周中的几天创建一个void enum变量,然后,我想让用户输入更新enum变量的天数

有没有办法用C+;中的新状态更新枚举变量+;? 我想知道是否有一种方法来更新C++中的枚举变量,动态地赋予程序新的状态。例如,我为一周中的几天创建一个void enum变量,然后,我想让用户输入更新enum变量的天数,c++,types,enums,set,C++,Types,Enums,Set,例如,我为一周中的几天创建一个void enum变量,然后,我想让用户输入更新enum变量的天数 不,这不是eNUMS在C++中的工作方式。它们只是一组固定的数值表示值,在编译时完全定义了这些值 枚举值: 必须在编译时完全定义(所有) 无法在运行时使用新引入的值进行扩展 没有作为人类可读文本的标准表示 您需要的是用户输入(假设字符串数据)和预定义枚举值之间的映射,例如 enum class Weekday { Monday, Tuesday, Wednesday, Thursday, Fri

例如,我为一周中的几天创建一个void enum变量,然后,我想让用户输入更新enum变量的天数

<>不,这不是eNUMS在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.")
}
然后,您可以在例程中使用这些函数,这些例程需要用户界面在工作日输入


注:

  • 有更复杂的方法来定义上述函数(例如,对于管理
    工作日
    值的简单类,有铸态运算符定义;对于
    std::ostream::operator()
    ,有面向流的重载),但归根结底,这就是上面提到的方法
  • 如果要对其进行配置,用户希望为特定工作日输入的内容(例如,
    工作日::星期二
    “povjaj”
    1),则必须将枚举封装到一个类中,该类提供为每个
    工作日
    值设置
    std::string
    值,并将这些值保存在额外的变量中


1) 不幸的是,现在仍然没有合适的klingon到Unicode的映射。

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