c – 如何创建定制时钟用于std :: chrono函数?

我有一些任意的时代,如1988年7月13日.本质上我想衡量相对于此的时间.我正在考虑编写一个自定义的时钟类,以便我可以编写如下代码
using std::chrono;
time_point<My_Clock> tp;
std::cout << duration_cast<seconds>(tp.time_since_epoch()).count() << std::endl;

这可能吗?如果没有,最干净的方法是做什么?

解决方法

写这个定制时钟的很大一部分就是弄清楚如何编写它的Now()函数.在下面的例子中,我将基于Now()关闭system_clock的Now().首先,我做了一些侦探工作,发现我的系统时钟有一个1970年的新纪元,忽略了 leap seconds.这被称为 unix time.事实证明,我知道的每个实现(我想我已经检查了所有)具有这个非常相似的时期(但是这是未被C11标准指定的).

接下来我计算出1988-07-13是1970-01-01之后的6768天.使用这两个事实,其余的很容易:

#include <chrono>

struct My_Clock
{
    typedef std::chrono::seconds              duration;
    typedef duration::rep                     rep;
    typedef duration::period                  period;
    typedef std::chrono::time_point<My_Clock> time_point;
    static const bool is_steady =             false;

    static time_point Now() noexcept
    {
        using namespace std::chrono;
        return time_point
          (
            duration_cast<duration>(system_clock::Now().time_since_epoch()) -
            hours(6768*24)
          );
    }
};

MyClock需要嵌套的typedef来描述它的duration,rep,period和time_point.根据你的问题,我选择了秒作为持续时间,但你可以选择任何你想要的.

对于Now()函数,我只是调用system_clock :: Now()并以秒为单位减去历元.我通过使用MyClock ::持续时间来编写所有内容,只需要一点聪明才能使我能够更容易地改变持续时间.请注意,我能够按时间减去时代,它隐含地转换为持续时间(即秒).或者,我可以建立自己的定制时间:

typedef std::chrono::duration<int,std::ratio_multiply<std::chrono::hours::period,std::ratio<24>>> days;

然后现在()的返回可能已经写成:

return time_point
          (
            duration_cast<duration>(system_clock::Now().time_since_epoch()) -
            days(6768)
          );

无论如何,现在你可以这样使用:

#include <iostream>

int
main()
{
    using namespace std::chrono;
    time_point<My_Clock> tp = My_Clock::Now();
    std::cout << tp.time_since_epoch().count() << '\n';
}

哪个为我打印出来:

786664963

这表明今天(2013-06-16)在1988-07-13之后约为24.9年.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...