c – 如何创建定制时钟用于std :: chrono函数?
发布时间:2020-12-16 05:46:47 所属栏目:百科 来源:网络整理
导读:我有一些任意的时代,如1988年7月13日.本质上我想衡量相对于此的时间.我正在考虑编写一个自定义的时钟类,以便我可以编写如下代码: using std::chrono;time_pointMy_Clock tp;std::cout duration_castseconds(tp.time_since_epoch()).count() std::endl; 这可
我有一些任意的时代,如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年. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |