在文件范围内,特别是在头文件中,不鼓励使用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
从浮点持续时间转换成一整体的持续时间时。这不仅会更频繁地给出“预期”的答案,而且会比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});
如果这个代码的目的是在文件范围内,你不想在文件范围,这些usings(这是完全可以理解的),只需创建一个函数来封装它们:
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
'的std ::计时:: seconds'? – nwp
编写一个函数? –
也许在本地范围内使用namespace std :: chrono;或使用其他别名? – Akira