【问题标题】:Looping backwards through enum values通过枚举值向后循环
【发布时间】:2015-06-15 14:20:47
【问题描述】:

我正在学习 C++,目前正在尝试制作一个名为 weekdayenum 类型,代表一周中的几天,以及一些在这些日子之间来回移动的基本功能。 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 枚举中未定义为有效值。

我会尝试通过添加枚举的基数(7 + -3 = 4 = 星期五)来操纵我的 changeDay 函数中的值以始终返回正值,但似乎 "there's not really a good way to do this"。 (是的,我知道我可以在函数中硬编码一周中的天数,但我对那种解决方案不感兴趣)。

有什么方法可以让我的函数在我的枚举中向后循环?

【问题讨论】:

  • 没有什么比this answer更好(即添加WEEKDAY_COUNT作为最后一个枚举值)
  • 为什么是% 4?这似乎没有意义(4
  • 抱歉打错了...谢谢 Yakk
  • 我写了一个只有头文件的库,可以让你以“自然”的方式实现它,但你必须使用宏来声明枚举。为避免我发布垃圾邮件,请说明您是否正在寻找无库解决方案。

标签: c++ enums


【解决方案1】:

试试下面的

#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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2013-06-12
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多