繁体   English   中英

向后遍历枚举值

[英]Looping backwards through enum values

我正在学习C ++,目前正在尝试创建一种称为weekdayenum类型,它表示一周中的每一天,以及一些在各天之间来回移动的基本函数。 enum类型定义如下:

enum weekday {
    Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
};

我想打一个调用的函数changeDay将找了一天也就是delta从给定天了startDay (例如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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM