如何使用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_systo_utc/from_utc.
  • 的任何 user-written 时钟

请参阅 C++20 更新 部分,了解如何为您的自定义时钟添加这些功能的示例。

任何没有静态成员函数 to_sys/from_systo_utc/from_utc 的时钟在 [=15] 中使用时将无法编译=] 作为源或目标。

这是一个使用 clock_cast 的示例,用于将基于 system_clocktime_point 转换为基于 utc_clocktime_point milliseconds.

的精度
auto t = sys_days{July/1/2015} - 500ms;
auto u = clock_cast<utc_clock>(t);