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.

Пусть

  • 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)

См. также

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/cpp/chrono/duration/duration_cast

Spec-Zone.ru

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