2013-05-14 75 views
11

我有一些任意的时代,像1988年7月13日。基本上我想测量相对于此的时间。我想写一个自定义时钟类,以便我可以这样写代码:如何创建一个用于std :: chrono函数的自定义时钟?

using std::chrono; 
time_point<My_Clock> tp; 
std::cout << duration_cast<seconds>(tp.time_since_epoch()).count() << std::endl; 

这可能吗?如果没有,那么完成这个最简洁的方法是什么?

+0

我敢打赌,标准有要求列出。 – chris 2013-05-14 00:24:39

+0

'time_point'接受'Clock'作为模板,这是一个概念。你可以编写自己的类,以满足特定概念所要求的要求。但是不要只说我的话,我只是在大声思考。 – 2013-05-14 00:28:11

+0

@DanielKamilKozar我看了一下system_clock的源代码,但是我没有想太多。我没有看到实际时期在哪里指定。我认为这取决于系统。我在哪里可以找到关于如何做这种事情的文档? – sagargp 2013-05-14 03:41:00

回答

22

编写这个自定义时钟的难点在于弄清楚如何编写now()函数。在下面的示例中,我基于system_clocknow()关闭now()。首先,我做一些侦探工作,发现我的system_clock有一个1970年新纪元,忽略了leap seconds。这就是所谓的unix time。事实证明,我知道的每个实现(我认为我已经检查过它们)具有这个非常相同的时代(但这是C++ 11标准未指定的)。

接下来我计算出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需要嵌套类型定义来描述其durationrepperiodtime_point。根据你的问题,我选择seconds作为duration,但你可以选择任何你想要的。

对于now()函数,我只需拨打system_clock::now()并以秒为单位减去纪元。通过写入所有关于MyClock::duration的内容,我对此计算有点聪明,这样我可以更容易地更改duration。请注意,我能够从hours中减去时期,这隐含地转换为duration(即seconds)。或者我可以自己建天的自定义duration

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

然后的now()回也可以写成:

 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年。

+0

这真棒,正是我所需要的。谢谢! – sagargp 2013-06-22 19:20:42

相关问题