編寫這個自定義時鐘的難點在於弄清楚如何編寫now()
函數。在下面的示例中,我基於system_clock
的now()
關閉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
需要嵌套類型定義來描述其duration
,rep
,period
和time_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年。
我敢打賭,標準有要求列出。 – chris 2013-05-14 00:24:39
'time_point'接受'Clock'作爲模板,這是一個概念。你可以編寫自己的類,以滿足特定概念所要求的要求。但是不要只說我的話,我只是在大聲思考。 – 2013-05-14 00:28:11
@DanielKamilKozar我看了一下system_clock的源代碼,但是我沒有想太多。我沒有看到實際時期在哪裏指定。我認爲這取決於系統。我在哪裏可以找到關於如何做這種事情的文檔? – sagargp 2013-05-14 03:41:00