Namespaces
Variants

std::chrono:: duration_cast

From cppreference.net
Определено в заголовочном файле <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 будет typename ToDuration :: rep ,
  • ToPeriod будет typename ToDuration :: 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)
временной интервал
(шаблон класса)
преобразует точку времени в другую точку времени на тех же часах, с другой длительностью
(шаблон функции)
преобразует длительность в другую, округляя вниз
(шаблон функции)
преобразует длительность в другую, округляя вверх
(шаблон функции)
преобразует длительность в другую, округляя к ближайшему, при равенстве к чётному
(шаблон функции)