2017-08-25 47 views
1

我可以这样做:Terse从双秒转换为std :: chrono :: steady_clock :: duration?

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

+4

'的std ::计时:: seconds'? – nwp

+1

编写一个函数? –

+0

也许在本地范围内使用namespace std :: chrono;或使用其他别名? – Akira

回答

0

在文件范围内,特别是在头文件中,不鼓励使用using namespaces是很有原因的。但是,在函数范围内,尤其是<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的新增功能。但是你可以从herehere等不同位置抓取它,并立即开始使用它。此外,如果你使用{}对构造它有助于从函数调用区分对象的构造,使代码更易于阅读:

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 
相关问题