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 в duration другого типа ToDuration.
Функция не участвует в разрешении перегрузки, если только ToDuration не является специализацией std::chrono::duration.
Неявные преобразования не используются. По возможности избегают умножения и деления, если во время компиляции известно, что один или несколько параметров равны 1. Вычисления выполняются в самом широком доступном типе и преобразуются, как если бы static_cast, в тип результата только по завершении.
Параметры
| d | — | длительность для преобразования |
Возвращаемое значение
d преобразуется в длительность типа ToDuration.
Примечание
Преобразование между целочисленными длительностями, когда исходный период точно делится на целевой период (например, часы и минуты), или между длительностями с плавающей запятой, может быть выполнено с помощью обычных преобразований или неявно через конструкторы std::chrono::duration, duration_cast не требуется.
Преобразование длительности с плавающей запятой в целочисленную подвержено неопределённому поведению, когда значение с плавающей запятой равно NaN, бесконечности или слишком велико для представления целочисленным типом цели. В противном случае приведение к целочисленной длительности подлежит усечению, как и любое static_cast к целочисленному типу.
Пример
В этом примере измеряется время выполнения функции
#include <iostream>
#include <chrono>
#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();
// длительность с плавающей запятой: не требуется duration_cast
const std::chrono::duration<double, std::milli> fp_ms = t2 - t1;
// целочисленная длительность: требуется duration_cast
auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1);
// преобразование целой длительности в целую длительность более короткой
// кратной единицы времени: duration_cast не требуется
std::chrono::duration<long, std::micro> int_usec = int_ms;
std::cout << "f() выполнялась " << fp_ms << ", или "
<< int_ms << " (целые миллисекунды), или "
<< int_usec << " (целые микросекунды)\n";
}
Возможный вывод:
f() выполнялась 1000.14ms, или 1000ms (целые миллисекунды), or 1000000us (целые микросекунды)
Смотрите также
(C++11) |
временной интервал (шаблон класса) |
(C++11) |
преобразует момент времени в другой момент времени на тех же часах с другой длительностью (шаблон функции) |
(C++17) |
преобразует duration в другой, округляя в меньшую сторону (шаблон функции) |
(C++17) |
преобразует duration в другой, округляя в большую сторону (шаблон функции) |
(C++17) |
преобразует duration в другой, округляя до ближайшего, или до чётного в промежуточных случаях (шаблон функции) |