Namespaces
Variants

std::chrono:: duration_cast

From cppreference.net
Definido en el encabezado <chrono>
template < class ToDuration, class Rep, class Period >
constexpr ToDuration duration_cast ( const std:: chrono :: duration < Rep, Period > & d ) ;
(desde C++11)

Convierte una std::chrono::duration a una duración de tipo diferente ToDuration .

La función solo participa en la resolución de sobrecarga si ToDuration es una especialización de std::chrono::duration .

Sea

  • ToRep sea typename ToDuration :: rep ,
  • ToPeriod sea typename ToDuration :: period ,
  • CF sea std:: ratio_divide < Period, ToPeriod > ,
  • CR sea std:: common_type < Rep, ToRep, std:: intmax_t > :: type ,
  • cr_count sea static_cast < CR > ( d. count ( ) ) ,
  • cr_num sea static_cast < CR > ( CF :: num ) , y
  • cr_den sea static_cast < CR > ( CF :: den ) ,

el resultado es:

CF :: num
1 no 1
CF :: den 1 ToDuration ( static_cast < ToRep >
( d. count ( ) ) )
ToDuration ( static_cast < ToRep >
( cr_count * cr_num ) )
no 1 ToDuration ( static_cast < ToRep >
( cr_count / cr_den ) )
ToDuration ( static_cast < ToRep >
( cr_count * cr_num / cr_den ) )

Contenidos

Parámetros

d - duración a convertir

Valor de retorno

d convertido a una duración de tipo ToDuration .

Notas

No se utilizan conversiones implícitas. Las multiplicaciones y divisiones se evitan cuando es posible, si se conoce en tiempo de compilación que uno o más parámetros son 1 . Los cálculos se realizan en el tipo más amplio disponible y se convierten, como si fuera mediante static_cast , al tipo de resultado solo cuando finalizan.

La conversión entre duraciones enteras donde el período fuente es exactamente divisible por el período destino (por ejemplo, de horas a minutos) o entre duraciones de punto flotante puede realizarse con conversiones ordinarias o implícitamente mediante los std::chrono::duration constructores , no se necesita duration_cast .

La conversión de una duración de punto flotante a una duración entera está sujeta a comportamiento indefinido cuando el valor de punto flotante es NaN, infinito, o demasiado grande para ser representable por el tipo entero de destino. De lo contrario, la conversión a una duración entera está sujeta a truncamiento como con cualquier static_cast a un tipo entero.

Ejemplo

Este ejemplo mide el tiempo de ejecución de una función.

#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";
}

Salida posible:

f() took 1000.14ms, or 1000ms (whole milliseconds), or 1000000us (whole microseconds)

Véase también

(C++11)
un intervalo de tiempo
(plantilla de clase)
convierte un punto temporal a otro punto temporal en el mismo reloj, con una duración diferente
(plantilla de función)
convierte una duración a otra, redondeando hacia abajo
(plantilla de función)
convierte una duración a otra, redondeando hacia arriba
(plantilla de función)
convierte una duración a otra, redondeando al más cercano, empates al par
(plantilla de función)