我可以做到这一点:
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 的新功能。但您可以从不同的地方获取它,例如 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
,那么您可以使用更具体的类型别名和 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/