如何使用clock_cast?
How to use clock_cast?
我想转换不同时钟的时间点。目前我遵循 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);
}
我如何利用 clock_cast
来达到这个目的。目前我使用 Visual Studio 2019.
std::clock_cast
在 C++20 中是新的,所以如果你有 C++11 实现,那你就不走运了。一些实现仍然没有完全实现 C++20,所以你可能仍然不走运。不幸的是,似乎没有为 std::clock_cast
定义的功能测试宏,因此您将不得不检查编译器的文档。
std::chrono::clock_cast
的第一个参数是目标时钟,而不是想要的time_point.
auto to_sys_clk(std::chrono::high_resolution_clock::time_point tp)
{
return std::chrono::clock_cast<std::chrono::system_clock>(tp);
}
std::chrono::high_resolution_clock
未参与 std::chrono::clock_cast
设施。这样做的原因是 high_resolution_clock
与任何人类日历都没有可移植的关系。它 可能 在某些平台上有一个,特别是如果它是 system_clock
的类型别名。但绝对不是在所有平台上。
这是参与 clock_cast
基础设施的时钟列表:
std::chrono::system_clock
std::chrono::utc_clock
std::chrono::tai_clock
std::chrono::gps_clock
std::chrono::file_clock
- 提供静态成员函数
to_sys
/from_sys
或 to_utc
/from_utc
. 的任何 user-written 时钟
请参阅 的 C++20 更新 部分,了解如何为您的自定义时钟添加这些功能的示例。
任何没有静态成员函数 to_sys
/from_sys
或 to_utc
/from_utc
的时钟在 [=15] 中使用时将无法编译=] 作为源或目标。
这是一个使用 clock_cast
的示例,用于将基于 system_clock
的 time_point
转换为基于 utc_clock
的 time_point
milliseconds
.
的精度
auto t = sys_days{July/1/2015} - 500ms;
auto u = clock_cast<utc_clock>(t);
我想转换不同时钟的时间点。目前我遵循 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);
}
我如何利用 clock_cast
来达到这个目的。目前我使用 Visual Studio 2019.
std::clock_cast
在 C++20 中是新的,所以如果你有 C++11 实现,那你就不走运了。一些实现仍然没有完全实现 C++20,所以你可能仍然不走运。不幸的是,似乎没有为 std::clock_cast
定义的功能测试宏,因此您将不得不检查编译器的文档。
std::chrono::clock_cast
的第一个参数是目标时钟,而不是想要的time_point.
auto to_sys_clk(std::chrono::high_resolution_clock::time_point tp)
{
return std::chrono::clock_cast<std::chrono::system_clock>(tp);
}
std::chrono::high_resolution_clock
未参与 std::chrono::clock_cast
设施。这样做的原因是 high_resolution_clock
与任何人类日历都没有可移植的关系。它 可能 在某些平台上有一个,特别是如果它是 system_clock
的类型别名。但绝对不是在所有平台上。
这是参与 clock_cast
基础设施的时钟列表:
std::chrono::system_clock
std::chrono::utc_clock
std::chrono::tai_clock
std::chrono::gps_clock
std::chrono::file_clock
- 提供静态成员函数
to_sys
/from_sys
或to_utc
/from_utc
. 的任何 user-written 时钟
请参阅
任何没有静态成员函数 to_sys
/from_sys
或 to_utc
/from_utc
的时钟在 [=15] 中使用时将无法编译=] 作为源或目标。
这是一个使用 clock_cast
的示例,用于将基于 system_clock
的 time_point
转换为基于 utc_clock
的 time_point
milliseconds
.
auto t = sys_days{July/1/2015} - 500ms;
auto u = clock_cast<utc_clock>(t);