从双秒转换到std :: chrono :: steady_clock :: duration?

时间:2017-08-25 14:49:24

标签: 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));

但我相信你会同意这是非常荒谬的。有没有更好的方式?

编辑:旁边显而易见的using namespace std::chrono

1 个答案:

答案 0 :(得分:0)

有充分的理由对于在文件范围内阻止使用using namespace s而变得狂热,特别是在标题中。但是在功能范围,,特别是<chrono> lib,using namespace std::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));

为:

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

我建议在从浮点持续时间转换为整数持续时间时使用round。这不仅会给出预期的&#34;回答更频繁,但它比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,那么您可以通过更多功能弥补特定类型别名和使用声明:

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