इस कस्टम घड़ी को लिखने का कठिन हिस्सा यह पता लगा रहा है कि 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 साल है।
मैं मानक शर्त सूचीबद्ध शर्त शर्त लगाऊंगा। – chris
'time_point' टेम्पलेट के रूप में 'घड़ी' स्वीकार करता है, जो एक अवधारणा है। आप केवल अपनी खुद की कक्षा लिख सकते हैं जो उस विशेष अवधारणा द्वारा लगाई गई आवश्यकताओं को पूरा करता है। लेकिन इसके लिए मेरा शब्द न लें, मैं बस जोर से सोच रहा हूं। –
@DanielKamilKozar मैंने इस उदाहरण के लिए system_clock के स्रोत में देखा लेकिन मुझे बहुत दूर नहीं मिला। मैं नहीं देखता कि वास्तविक युग कहाँ निर्दिष्ट है। मुझे लगता है कि यह प्रणाली निर्भर है। मुझे ऐसा कुछ करने के लिए दस्तावेज़ कहां मिलेगा? – sagargp