Spec-Zone.ru › C++

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)

См. также

duration
(C++11)
промежуток времени
(шаблон класса)
time_point_cast
(C++11)
преобразует точку времени в другую точку времени на том же часах с другой продолжительностью
(шаблон функции)
floor(std::chrono::duration)
(C++17)
преобразует продолжительность в другую, округляя вниз
(шаблон функции)
ceil(std::chrono::duration)
(C++17)
преобразует продолжительность в другую, округляя вверх
(шаблон функции)
round(std::chrono::duration)
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API