C++ 枚举中的整数溢出,仅循环通过命名整数

C++ 枚举中的整数溢出,仅循环通过命名整数,c++,c++11,enums,C++,C++11,Enums,我如何实现这种行为 enum周{ 星期日=0,星期一,星期二,星期三,星期四,星期五,星期六 }; enum week day=星期六;//6. //++day=>0 enum week day=sunday;//0 //--天=>6 您可以使用enum类并为其重载运算符(如@NathanOliver所建议的)。@Thomas Matthews建议的公式可用于避免处理负数: 枚举+运算符实现 week已重命名为day,以避免混淆(一个枚举值不代表整个星期,仅代表一天) 您可以使用enum类并

我如何实现这种行为

enum周{
星期日=0,星期一,星期二,星期三,星期四,星期五,星期六
};
enum week day=星期六;//6.
//++day=>0
enum week day=sunday;//0
//--天=>6

您可以使用enum类并为其重载运算符(如@NathanOliver所建议的)。@Thomas Matthews建议的公式可用于避免处理负数:

枚举+运算符实现

week
已重命名为
day
,以避免混淆(一个枚举值不代表整个星期,仅代表一天)


您可以使用enum类并为其重载运算符(如@NathanOliver所建议的)。@Thomas Matthews建议的公式可用于避免处理负数:

枚举+运算符实现

week
已重命名为
day
,以避免混淆(一个枚举值不代表整个星期,仅代表一天)


您必须将其封装在知道枚举边界值的函数中。使用
枚举类
,并自行定义运算符的行为。我是否可以以某种方式重载
++
&
-
运算符?@JohnDoe这正是NathanOliver的建议。有关签名,请参阅“外部类定义”此表中的列:当递增超过最后一个枚举时,您期望的行为是什么?您必须将其封装在知道枚举边界值的函数中。使用
枚举类
,并自行定义运算符的行为方式。我是否可以以某种方式重载
++
-
运算符?@JohnDoe这就是这正是纳撒诺利弗的建议。有关签名,请参阅表中的“外部类定义”列:当增量超过最后一个枚举时,您希望看到什么行为?
enum class day : unsigned char {
    sunday = 0, monday, tuesday, wednesday, thursday, friday, saturday
};

// preincrement
day& operator++(day& d)
{
    d = static_cast<day>((static_cast<unsigned char>(d) + 1) % 7);
    return d;
}

// postincrement
day operator++(day& d, int)
{
    day res = d;
    d = static_cast<day>((static_cast<unsigned char>(d) + 1) % 7);
    return res;
}

// predecrement
day& operator--(day& d)
{
    d = static_cast<day>((static_cast<unsigned char>(d) + 6) % 7);
    return d;
}

// postdecrement
day operator--(day& d, int)
{
    day res = d;
    d = static_cast<day>((static_cast<unsigned char>(d) + 6) % 7);
    return res;
}
std::ostream& operator<<(std::ostream& s, day d)
{
    switch (d)
    {
    case day::monday:
        s << "Monday";
        break;
    case day::tuesday:
        s << "Tuesday";
        break;
    case day::wednesday:
        s << "Wednesday";
        break;
    case day::thursday:
        s << "Thursday";
        break;
    case day::friday:
        s << "Friday";
        break;
    case day::saturday:
        s << "Saturday";
        break;
    case day::sunday:
        s << "Sunday";
        break;
    }
    return s; 
}

int main() {
    day d1 = day::sunday;
    --d1;

    day d2 = day::saturday;
    ++d2;

    day d3 = day::wednesday;
    --d3;

    day d4 = day::wednesday;
    ++d4;

    std::cout << d1 << '\n'
        << d2 << '\n'
        << d3 << '\n'
        << d4 << '\n';


    return 0;
}
Saturday
Sunday
Tuesday
Thursday