【问题标题】:Terse conversion from double seconds to std::chrono::steady_clock::duration?从双秒到 std::chrono::steady_clock::duration 的简洁转换?
【发布时间】:2017-08-25 14:49:24
【问题描述】:

我可以这样做:

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。

【问题讨论】:

  • std::chrono::seconds?
  • 写一个函数?
  • 可能是 using namespace std::chrono; 在本地范围内或使用其他别名?
  • std::chrono::seconds 据我所知只测量整数秒数。

标签: c++ chrono


【解决方案1】:

有充分的理由不鼓励在文件范围内使用using namespaces,尤其是在标题中。但是在 函数范围内, 特别是对于 &lt;chrono&gt; 库,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。这不仅会更频繁地给出“预期”的答案,而且比duration_cast 略少冗长。 std::chrono::round 是 C++17 的新功能。但是您可以从不同的地方获取它,例如 here 或 here,并从今天开始使用它。此外,如果您将{} 用于构造函数,它有助于区分对象构造和函数调用,从而使代码更易于阅读:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多