std::chrono::duration_cast
來自 cppreference.com
定義於標頭檔案 <chrono> |
||
template< class ToDuration, class Rep, class Period > constexpr ToDuration duration_cast( const std::chrono::duration<Rep, Period>& d ); |
(C++11 起) | |
將 std::chrono::duration 轉換為不同型別 ToDuration
的 duration。
僅當 ToDuration
是 std::chrono::duration 的特化時,此函式才參與過載決議。
令
-
ToRep
為 typename ToDuration::rep, -
ToPeriod
為 typename ToDuration::period, -
CF
為 std::ratio_divide<Period, ToPeriod>, -
CR
為 std::common_type<Rep, ToRep, std::intmax_t>::type, - cr_count 為 static_cast<CR>(d.count()),
- cr_num 為 static_cast<CR>(CF::num),且
- cr_den 為 static_cast<CR>(CF::den),
結果為
CF::num | |||
---|---|---|---|
1 | 非 1 | ||
CF::den | 1 | ToDuration(static_cast<ToRep> (d.count())) |
ToDuration(static_cast<ToRep> (cr_count * cr_num)) |
非 1 | ToDuration(static_cast<ToRep> (cr_count / cr_den)) |
ToDuration(static_cast<ToRep> (cr_count * cr_num / cr_den)) |
目錄 |
[編輯] 引數
d | - | 要轉換的 duration |
[編輯] 返回值
d 轉換為型別 ToDuration
的 duration。
[編輯] 注意
不使用隱式轉換。如果編譯時已知一個或多個引數為 1,則儘可能避免乘法和除法。計算在可用的最寬型別中進行,並且只在完成後才透過 static_cast 轉換為結果型別。
整數 duration 之間(源週期可被目標週期精確整除,例如小時到分鐘)或浮點 duration 之間的轉換可以使用普通轉換或透過 std::chrono::duration
建構函式隱式進行,無需 duration_cast
。
當浮點值為 NaN、無窮大或太大而無法由目標整數型別表示時,從浮點 duration 轉換為整數 duration 會導致未定義行為。否則,轉換為整數 duration 會像任何 static_cast 轉換為整數型別一樣進行截斷。
[編輯] 示例
此示例測量函式的執行時間。
執行此程式碼
#include <chrono> #include <iostream> #include <ratio> #include <thread> void f() { std::this_thread::sleep_for(std::chrono::seconds(1)); } int main() { const auto t1 = std::chrono::high_resolution_clock::now(); f(); const auto t2 = std::chrono::high_resolution_clock::now(); // floating-point duration: no duration_cast needed const std::chrono::duration<double, std::milli> fp_ms = t2 - t1; // integral duration: requires duration_cast const auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1); // converting integral duration to integral duration of // shorter divisible time unit: no duration_cast needed const std::chrono::duration<long, std::micro> int_usec = int_ms; std::cout << "f() took " << fp_ms << ", or " << int_ms << " (whole milliseconds), or " << int_usec << " (whole microseconds)\n"; }
可能的輸出
f() took 1000.14ms, or 1000ms (whole milliseconds), or 1000000us (whole microseconds)
[編輯] 參閱
(C++11) |
時間間隔 (類模板) |
(C++11) |
將一個時間點轉換為同一時鐘上的另一個時間點,但具有不同的時長 (函式模板) |
(C++17) |
將一個 duration 轉換為另一個,向下取整 (函式模板) |
(C++17) |
將一個 duration 轉換為另一個,向上取整 (函式模板) |
(C++17) |
將一個 duration 轉換為另一個,四捨五入到最接近的值,平局時取偶數 (函式模板) |