【问题标题】:Operators overloading for enums枚举的运算符重载
【发布时间】:2011-02-04 00:20:33
【问题描述】:

是否可以为枚举定义运算符?例如,我班上有枚举 Month,我希望能够编写 ++my_month。
谢谢
附:
为了避免溢出,我做了这样的事情:

void Date::add_month()
{
    switch(my_month_)
    {
    case Dec:
        my_month_ = Jan;
        add_year();
        break;
    default:
        ++my_month_;
        break;
    }
}

【问题讨论】:

    标签: c++ enums operators


    【解决方案1】:

    是的,您可以:

    enum Month
    {
      January,
      February,
      // ... snip ...
      December
    };
    
    // prefix (++my_month)
    Month& operator++(Month& orig)
    {
      orig = static_cast<Month>(orig + 1); // static_cast required because enum + int -> int
      //!!!!!!!!!!!
      // TODO : See rest of answer below
      //!!!!!!!!!!!
      return orig;
    }
    
    // postfix (my_month++)
    Month operator++(Month& orig, int)
    {
      Month rVal = orig;
      ++orig;
      return rVal;
    }
    

    但是,您必须决定如何处理“溢出”枚举。如果 my_month 等于 December,并且您执行语句 ++my_month,则 my_month 在数值上仍将等于 December + 1,并且在枚举中没有对应的命名值。如果您选择允许这样做,您必须假设枚举的实例可能超出范围。如果您选择在增加之前检查orig == December,您可以将值回绕到一月并消除此问题。但是,您会丢失已转入新一年的信息。

    TODO 部分的实现(或缺乏)将在很大程度上取决于您的个人用例。

    【讨论】:

      【解决方案2】:

      是的。可以对所有用户定义的类型进行运算符重载。这包括枚举。

      【讨论】:

      • 月 &operator++(月 &en) { en = static_cast(static_cast(en) + 1);返回 en; }
      • 感谢 Stephen 提供代码。如果月份已经是 12 月,则只需考虑该功能应该做什么。对任何人求模?
      • @Stephen:您不需要强制转换为 int,枚举隐式转换为 int(或更大,如有必要)以进行算术运算。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多