我可以做这个:

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旁边。

最佳答案

有充分的理由狂热地阻止在文件范围(尤其是在 header 中)使用using namespace。但是在函数范围内,尤其是<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,则可以使用更具体的类型别名和声明来弥补这一点:
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/

10-13 06:18