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.
Не используются неявные преобразования. Умножения и деления избегаются, где это возможно, если известно на этапе компиляции, что один или несколько параметров 1. Вычисления выполняются в типе с наибольшей шириной и преобразуются, как если бы с помощью static_cast, в тип результата только после завершения.
Параметры
| d | - | продолжительность для преобразования |
Значение результата
d преобразованная в продолжительность типа ToDuration.
Примечания
Преобразование между целочисленными продолжительностями, где исходный период точно делится на целевой период (например, часы в минуты) или между продолжительностями с плавающей точкой, может быть выполнено с помощью обычных преобразований или неявно через 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/w/cpp/chrono/duration/duration_cast