c++ - 从双秒到 std::chrono::steady_clock::duration 的简洁转换?

标签 c++ c++-chrono

我可以做到这一点:

double period_in_seconds = 3.4;

auto as_duration = std::chrono::duration_cast<std::chrono::steady_clock::duration>(std::chrono::duration<double>(period_in_seconds));

但我相信你会同意这是相当荒谬的。有没有更简洁的方法?

编辑:除了明显的使用命名空间 std::chrono 之外。

最佳答案

我们有充分的理由热衷于阻止使用 using namespace s 在文件范围内,尤其是在 header 中。但是在函数范围,尤其是 <chrono>库,using namespace std::chrono是你的 friend 。

仅此一步即可让您:

double period_in_seconds = 3.4;
auto as_duration = std::chrono::duration_cast<std::chrono::steady_clock::duration>(std::chrono::duration<double>(period_in_seconds));

至:

double period_in_seconds = 3.4;
using namespace std::chrono;
auto as_duration = duration_cast<steady_clock::duration>(duration<double>(period_in_seconds));

我建议使用round从浮点持续时间转换为整数持续时间时。这不仅会更频繁地给出“预期”答案,而且比 duration_cast 稍微简洁一些。 。 std::chrono::round是 C++17 的新功能。但您可以从不同的地方获取它,例如 herehere今天就开始使用它。另外,如果您使用 {}对于构造函数,它有助于区分对象构造和函数调用,使代码更容易阅读:

double period_in_seconds = 3.4;
using namespace std::chrono;
auto as_duration = round<steady_clock::duration>(duration<double>{period_in_seconds});

最后,请毫不犹豫地创建自定义持续时间,即使是在本地范围内以提高可读性:

double period_in_seconds = 3.4;
using namespace std::chrono;
using dsec = duration<double>;
auto as_duration = round<steady_clock::duration>(dsec{period_in_seconds});

编辑:如果由于某种原因(例如放错位置的样式指南)您无法使用本地函数 using namespace std::chrono ,那么您可以使用更具体的类型别名和 using 声明来弥补:

double period_in_seconds = 3.4;
using dsec = std::chrono::duration<double>;
using duration = std::chrono::steady_clock::duration;
using std::chrono::round;
auto as_duration = round<duration>(dsec{period_in_seconds});

如果此代码打算在文件范围内使用,并且您不希望在文件范围内使用这些用法(这是完全可以理解的),则只需创建一个函数来封装它们:

constexpr
std::chrono::steady_clock::duration
get_period(double period_in_seconds)
{
    using dsec = std::chrono::duration<double>;
    using duration = std::chrono::steady_clock::duration;
    using std::chrono::round;
    return round<duration>(dsec{period_in_seconds});
}

auto constexpr as_duration = get_period(3.4);

上面我什至证明了这个特定的示例都可以在编译时完成。 clang -O3 -S将上面的内容简化为以下程序集:

    .globl  _as_duration            ## @as_duration
    .p2align    3
_as_duration:
    .quad   3400000000              ## 0xcaa7e200

关于c++ - 从双秒到 std::chrono::steady_clock::duration 的简洁转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45884081/

相关文章:

作为 Objective-C++ 属性的 C++ 对象

c++ - 为什么通过指针调用 std::stringstream good() 会导致崩溃?

c++ - CERN ROOT 从 TNtuple 中提取数据

C++ 标准计时溢出

c++ - Chrono high_resolution_clock 给出不一致的时间?

C++ 从服务器注册回调

c++ - 无法在 OpenCV 中加载和叠加透明图像

c++ - 获取纳秒级的时间差

c++ - 日期时间到 UTC

c++ - 将 chrono::milliseconds 转换为 uint64_t?