【发布时间】:2022-01-11 09:33:38
【问题描述】:
使用<chrono> 库迈出第一步,
我从粒度time_point 的基本算术开始。
感谢@HowardHinnant 提供的非常有用的post,
我设法写了this:
#include <chrono>
using namespace std::chrono_literals;
int main()
{
std::chrono::sys_days d {std::chrono::January/31/2022};
d += std::chrono::days{2}; // ok
//d += 48h; // error: no match for 'operator+=' with std::chrono::hours
}
我不清楚为什么不允许使用d += 48h;。
std::chrono::time_point<>::operator+= 采用duration,
并且该表达式中的 rvalue 是 std::chrono::hours
在我看来代表了一个时间段。
这里的哲学是什么?是否有不同的持续时间类型
根据必须兼容的计量单位
time_point 的粒度?为什么?
另一方面,我明白为什么d += 2d; 会出错,
因为在这种情况下std::literals::chrono_literals::operator""d
是std::chrono::day,这不是持续时间(这很方便
形成一个日期文字,虽然看起来有点不一致
大部头书)。
想知道有没有更方便的表达方式
相当于std::chrono::days{2} 的持续时间文字。
【问题讨论】:
-
因为
sys_days的分辨率是几天而不是几小时,超出此范围的所有内容都会丢失。如果您想要小时粒度,请使用小时,或者更好,只需 std::chrono::time_point -
@Sahsahae 凭我的聪明才智,我假设
48h的持续时间相当于两天,因为我无法用2d表达它。我选择了一天的粒度只是为了看看它是如何工作的,但似乎我必须更好地研究这个库背后的基本原理。 -
一种更方便的方式来表达等同于
days{2}的持续时间文字——没有人可以阻止你创建自己的operator""_days -
@Ranoiaetep 这是我错过的一个好点。
-
关于持续时间、time_points 和时钟的基础知识,这里有一个 1 小时的视频教程:youtube.com/watch?v=P32hvk8b13M 关于如何在此基础上构建日历和时区的视频:youtube.com/watch?v=adSAN282YIw
标签: c++ literals duration chrono