有充分的理由不鼓励在文件范围内使用using namespaces,尤其是在标题中。但是在 函数范围内, 特别是对于 <chrono> 库,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