【问题标题】:Why can I not compare chrono::weekday's with operator<()?为什么我不能比较 chrono::weekday 和 operator<()?
【发布时间】:2021-04-18 00:58:41
【问题描述】:

在新的 C++20 &lt;chrono&gt; 标头中有一个 std::chrono::weekday 类型。为什么我不能将weekdays 与operator&lt; 进行比较,从而对它们进行排序?

auto wd1 = Wednesday;
auto wd2 = Thursday;
if (wd1 < wd2)  // compile-time error
{
    // do something
}

test.cpp:14:13: error: invalid operands to binary expression (std::chrono::weekday and 
std::chrono::weekday)
if (wd1 < wd2)
    ~~~ ^ ~~~

星期三不是比星期四少吗?

【问题讨论】:

    标签: c++ c++20 chrono


    【解决方案1】:

    &lt;chrono&gt;看来,没有Wednesday不小于Thursday

    Thursday - Wednesday 确实等于days{1}。但是Wednesday - Thursday 等于days{6},而不是days{-1}

    在现代文化中,有disagreement about which day is the first day of the week&lt;chrono&gt; 库认为我们不必就哪一天是一周的第一天达成一致。我们可以在没有这种约定的情况下对星期几进行有意义的计算。

    为方便此类计算,&lt;chrono&gt; 将工作日视为一个独立的日历,每 7 天重复一次,在任何 7 天周期之间绝对没有区别。星期一在星期日之后,星期四在星期三之后,星期日在星期六之后。它是一个由七个值组成的循环范围,没有开始也没有结束。

    实际上,就整数值而言,有两种流行的工作日编码:

    1. C 将 [Sunday, Saturday] 编码为 [0, 6]。
    2. ISO 将 [Monday, Sunday] 编码为 [1, 7]。

    &lt;chrono&gt; 通过在 weekday 构造函数中接受 [0, 7] 来表示 SundayMondayTuesdayWednesdayThursdayFridaySaturdaySunday,分别。并启用反向转换weekday有两个成员函数:

    1. c_encoding()
    2. iso_encoding()

    根据这两个协议返回与存储的weekday 关联的整数值(0 或 7 表示周日,1 到 6 表示周一至周六)。

    但是,对于涉及weekday 的计算,std::chrono::weekday 的底层编码应该被视为一个不重要的细节。

    std::chrono::weekday 是一个包含 7 个值的循环范围。没有值大于任何其他值。它们要么相等,要么不相等。

    任何两个weekday 值之间的差异(比如xy)导致days 的数量x 领先于y。这是真的,无论你想象什么数字编码代表 weekday 在引擎盖下。

    这意味着Wednesday 不小于ThursdayWednesdayThursday 早 6 天,ThursdayWednesday 早 1 天。

    这种设计可以在不依赖于底层编码的情况下进行诸如“从这个日期开始的下一个星期一”之类的计算:

    std::chrono::sys_days
    next_monday(std::chrono::sys_days x)
    {
        using namespace std::chrono;
        return x + (Monday - weekday{x});
    }
    

    英文:

    x 的工作日比星期一晚多少天?将那么多天添加到x

    【讨论】:

    • 至少,Monday 应该明显小于Friday。我们可以例外吗:-)
    • 也许我们应该在工作日中添加“享受点”。 :-)
    • 仿射答案。就像模块是向量空间一样,仿射空间是什么?但是我猜Z_7是一个场,所以工作日的空间是仿射空间?
    猜你喜欢
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    相关资源
    最近更新 更多