2017-08-25 49 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 
相關問題