我可以这样做:
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
。
答案 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的新功能。但是您可以从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