std::chrono:: duration_cast
|
Определено в заголовочном файле
<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
.
Функция участвует в разрешении перегрузки только если
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 | - | длительность для преобразования |
Возвращаемое значение
d
преобразуется в длительность типа
ToDuration
.
Примечания
Неявные преобразования не используются. Умножения и деления избегаются, когда это возможно, если известно на этапе компиляции, что один или несколько параметров равны 1 . Вычисления производятся в самом широком доступном типе и преобразуются, как если бы с помощью static_cast , в результирующий тип только по завершении.
Преобразование между целочисленными длительностями, где исходный период точно делится на целевой период (например, часы в минуты), или между длительностями с плавающей точкой может выполняться с помощью обычных приведений или неявно через
std::chrono::duration
конструкторы
, без необходимости в
duration_cast
.
Приведение из длительности с плавающей точкой к целочисленной длительности приводит к неопределённому поведению когда значение с плавающей точкой является NaN, бесконечностью или слишком велико для представления целевым целочисленным типом. В остальных случаях приведение к целочисленной длительности подвержено усечению, как и при любом 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)
|
преобразует длительность в другую, округляя вниз
(шаблон функции) |
|
(C++17)
|
преобразует длительность в другую, округляя вверх
(шаблон функции) |
|
(C++17)
|
преобразует длительность в другую, округляя к ближайшему, при равенстве к чётному
(шаблон функции) |