2013-05-14 9 views
11

मेरे पास 13 जुलाई, 1 9 88 की तरह कुछ मनमाना युग है। अनिवार्य रूप से मैं इसके सापेक्ष समय को मापना चाहता हूं। मैं एक कस्टम घड़ी वर्ग लिखने की सोच रहा था, ताकि मैं इस तरह कोड लिख सकूं:std :: chrono फ़ंक्शंस में उपयोग के लिए कस्टम घड़ी कैसे बनाएं?

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

क्या यह संभव है? यदि नहीं, तो इसे पूरा करने का सबसे साफ तरीका क्या है?

+0

मैं मानक शर्त सूचीबद्ध शर्त शर्त लगाऊंगा। – chris

+0

'time_point' टेम्पलेट के रूप में 'घड़ी' स्वीकार करता है, जो एक अवधारणा है। आप केवल अपनी खुद की कक्षा लिख ​​सकते हैं जो उस विशेष अवधारणा द्वारा लगाई गई आवश्यकताओं को पूरा करता है। लेकिन इसके लिए मेरा शब्द न लें, मैं बस जोर से सोच रहा हूं। –

+0

@DanielKamilKozar मैंने इस उदाहरण के लिए system_clock के स्रोत में देखा लेकिन मुझे बहुत दूर नहीं मिला। मैं नहीं देखता कि वास्तविक युग कहाँ निर्दिष्ट है। मुझे लगता है कि यह प्रणाली निर्भर है। मुझे ऐसा कुछ करने के लिए दस्तावेज़ कहां मिलेगा? – sagargp

उत्तर

22

इस कस्टम घड़ी को लिखने का कठिन हिस्सा यह पता लगा रहा है कि now() फ़ंक्शन कैसे लिखना है। नीचे दिए गए उदाहरण में now()system_clock के now() से नीचे है। सबसे पहले मैं यह पता लगाने के लिए कुछ जासूसी कार्य करता हूं कि मेरा system_clock नया साल 1 9 70 का युग है, leap seconds की उपेक्षा करता है। इसे unix time के रूप में जाना जाता है। जैसा कि यह पता चला है, हर कार्यान्वयन मुझे पता है (और मुझे लगता है कि मैंने उन सभी की जांच की है) यह एक ही युग है (लेकिन यह सी ++ 11 मानक द्वारा निर्दिष्ट नहीं है)।

अगला मैं गणना करता हूं कि 1988-07-13 1 9 70-01-01 के बाद 6768 दिन है। इन दोनों तथ्यों का उपयोग करना, बाकी आसान है: नेस्ट typedefs अपने duration, rep, period, और time_point वर्णन करने के लिए

#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 जरूरतों। आपके प्रश्न के आधार पर, मैंने seconds को duration के रूप में चुना है, लेकिन आप जो कुछ भी चाहते हैं उसे चुन सकते हैं।

now() फ़ंक्शन के लिए मैं केवल system_clock::now() पर कॉल करता हूं और सेकंड की इकाइयों में युग को घटा देता हूं। मुझे MyClock::duration के संदर्भ में सबकुछ लिखकर इस गणना के साथ थोड़ा सा चालाक मिला है ताकि मैं duration को और आसानी से बदल सकूं। ध्यान दें कि मैं hours के संदर्भ में युग को घटाने में सक्षम था, जो स्पष्ट रूप से duration (जो seconds है) में परिवर्तित हो जाता है।

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

और फिर now() की वापसी लिखा गया हो सकता:: वैकल्पिक रूप से मैं अपने आप को कुछ दिनों के कस्टम duration बनाया जा सकता था

:

 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) 1 9 88-07-13 के बाद लगभग 24.9 साल है।

+0

यह बहुत ही बढ़िया है, बिल्कुल मुझे जो चाहिए था। धन्यवाद! – sagargp

संबंधित मुद्दे