名稱空間
變體
操作

std::chrono::duration_cast

來自 cppreference.com
< cpp‎ | chrono‎ | duration
 
 
 
 
定義於標頭檔案 <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。

僅當 ToDurationstd::chrono::duration 的特化時,此函式才參與過載決議。

  • ToReptypename ToDuration::rep
  • ToPeriodtypename ToDuration::period
  • CFstd::ratio_divide<Period, ToPeriod>
  • CRstd::common_type<Rep, ToRep, std::intmax_t>::type
  • cr_countstatic_cast<CR>(d.count())
  • cr_numstatic_cast<CR>(CF::num),且
  • cr_denstatic_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)
時間間隔
(類模板) [編輯]
將一個時間點轉換為同一時鐘上的另一個時間點,但具有不同的時長
(函式模板) [編輯]
將一個 duration 轉換為另一個,向下取整
(函式模板) [編輯]
將一個 duration 轉換為另一個,向上取整
(函式模板) [編輯]
將一個 duration 轉換為另一個,四捨五入到最接近的值,平局時取偶數
(函式模板) [編輯]