如何解决枚举中的整数溢出,仅循环命名整数
我怎样才能实现这种行为?
enum week {
sunday=0,monday,tuesday,wednesday,thursday,friday,saturday
};
enum week day = saturday; // 6
// ++day => 0
enum week day = sunday; // 0
// --day => 6
解决方法
您可以使用枚举类并为其重载运算符(如@NathanOliver 所建议的那样)。 @Thomas Matthews 建议的公式可用于避免处理负数:
枚举 + 运算符实现
week
被重命名为 day
以避免混淆(一个枚举值不代表一整周,只代表一天)
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。