2013-05-14 46 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

相關問題