I would like to convert time points from different clocks. Currently I follow the suggestion from here.
static auto ref_sys_clk = std::chrono::system_clock::now();
static auto ref_std_clk = std::chrono::high_resolution_clock::now();
auto to_sys_clk(std::chrono::high_resolution_clock::time_point tp)
{
//return std::chrono::clock_cast<std::chrono::system_clock::time_point>(tp);
return ref_sys_clk std::chrono::duration_cast<std::chrono::system_clock::duration>(tp - ref_std_clk);
}
How can I utilize clock_cast for this purpose. Currently I use Visual Studio 2019.
CodePudding user response:
std::chrono::high_resolution_clock does not participate in the std::chrono::clock_cast facility. The reason for this is that high_resolution_clock, has no portable relationship to any human calendar. It might have one on some platforms, notably if it is a type alias for system_clock. But it definitely does not on all platforms.
Here is a list of clocks that participate in the clock_cast infrastructure:
std::chrono::system_clockstd::chrono::utc_clockstd::chrono::tai_clockstd::chrono::gps_clockstd::chrono::file_clock- Any user-written clock that supplies the static member functions
to_sys/from_sys, orto_utc/from_utc.
See the Update for C 20 section of this answer for an example of how to add these functions for your custom clock.
Any clock that does not have the static member functions to_sys/from_sys, or to_utc/from_utc will fail to compile when used in a clock_cast as either the source or destination.
Here is an example use of clock_cast being used to convert from a system_clock-based time_point to a utc_clock-based time_point at a precision of milliseconds.
auto t = sys_days{July/1/2015} - 500ms;
auto u = clock_cast<utc_clock>(t);
CodePudding user response:
std::clock_cast is new in C 20, so if you have a C 11 implementation, you are out of luck. Some implementations still haven't fully implemented C 20, so you may still be out of luck. Unfortunately there doesn't seem to be a feature test macro defined for std::clock_cast, so you will have to check your complier's documentation.
The first parameter of std::chrono::clock_cast is the destination clock, not the desired time_point.
auto to_sys_clk(std::chrono::high_resolution_clock::time_point tp)
{
return std::chrono::clock_cast<std::chrono::system_clock>(tp);
}
