我们有充分的理由热衷于阻止使用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));
to:
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 or 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});
Edit:如果由于某种原因(比如错误的风格指南)你不能使用函数局部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