向后循环遍历枚举值
Looping backwards through enum values
我正在学习C++,目前正在尝试制作一种名为weekday
的enum
类型,表示一周中的几天,以及一些在一天之间来回移动的基本函数。enum
类型定义如下:
enum weekday {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
};
我想制作一个名为 changeDay
的函数,该函数将找到距离给定startDay
delta
天的日期。(例如 changeDay(Monday, 4) == Friday
)。我有这样定义的函数:
void incrementDay(weekday& startDay, int delta){
startDay = weekday((startDay + delta) % 7);
}
只要我及时前进,这个函数就可以很好地工作(即 delta > 0
)。但是,我也希望能够支持回到过去(即 delta < 0
)。这导致了以下问题:例如,如果我想在星期二前 4 天去,我希望得到星期五。但是,按照我的函数的工作方式,将返回值-3
,该值在我的weekday
枚举中未定义为有效值。
我会尝试操作我的 changeDay
函数的值,以始终通过添加枚举的基数(7 + -3 = 4 = 星期五)来返回正值,但似乎"没有真正的好方法可以做到这一点"。(是的,我知道我可以在函数中对一周中的天数进行硬编码,但我对这种解决方案不感兴趣)。
有没有办法让我的函数向后循环我的枚举?
尝试以下操作
#include <iostream>
enum weekday
{
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
};
const char * weekday_name[] =
{
"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
};
void incrementDay( weekday &startDay, int delta )
{
if ( delta )
{
delta %= Sunday + 1;
if ( delta < 0 ) delta = Sunday + delta + 1;
startDay = static_cast<weekday>( ( startDay + delta ) % ( Sunday + 1 ) );
}
}
int main()
{
for ( int i = 0; i < 14; i++ )
{
weekday day = Monday;
incrementDay( day, i );
std::cout << day << ": " << weekday_name[day] << std::endl;
}
std::cout << std::endl;
for ( int i = 0; i < 14; i++ )
{
weekday day = Monday;
incrementDay( day, -i );
std::cout << day << ": " << weekday_name[day] << std::endl;
}
}
程序输出为
0: Monday
1: Tuesday
2: Wednesday
3: Thursday
4: Friday
5: Saturday
6: Sunday
0: Monday
1: Tuesday
2: Wednesday
3: Thursday
4: Friday
5: Saturday
6: Sunday
0: Monday
6: Sunday
5: Saturday
4: Friday
3: Thursday
2: Wednesday
1: Tuesday
0: Monday
6: Sunday
5: Saturday
4: Friday
3: Thursday
2: Wednesday
1: Tuesday
相关文章:
- 不带大括号的枚举形式
- 有什么方法可以遍历结构吗
- 枚举环境变量的惯用C++14/C++17方法
- 在循环中按顺序遍历成员变量
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 是否可以在 constexpr 函数中遍历枚举成员,因此值为 constexpr
- 在c++中遍历非连续枚举元素
- 无法遍历Qt枚举
- 向后循环遍历枚举值