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— typenameToDuration::rep, -
ToPeriod— typenameToDuration::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) | преобразует длительность в другую с округлением до ближайшего значения, при равном удалении выбирая чётное (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/chrono/duration/duration_cast