std::chrono::duration_cast
| Definido en el archivo de encabezado <chrono>
|
||
template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const std::chrono::duration<Rep,Period>& d);
|
(desde C++11) | |
Convierte un objeto de tipo std::chrono::duration en una duración de diferente tipo ToDuration.
La función no participa en la resolución de sobrecarga a menos que ToDuration sea una especialización de std::chrono::duration.
No se utilizan conversiones implícitas. Las multiplicaciones y divisiones se evitan siempre que sea posible, si se sabe en tiempo de compilación que uno o más parámetros son 1. Los cálculos se realizan en el tipo más ancho disponible y se convierten, como si fuera static_cast, al tipo de resultado solo cuando finaliza.
Parámetros
| d | - | La duración a convertir. |
Valor de retorno
d convertida a una duración de tipo ToDuration.
Notas
La conversión entre duraciones enteras donde el período de origen es exactamente divisible por el período de destino (por ejemplo, horas a minutos) o entre duraciones de punto flotante se puede realizar con conversiones ordinarias o implícitamente a través de constructores de std::chrono::duration, no se necesita duration_cast.
La conversión de una duración de punto flotante a una duración de tipo entero está sujeta a comportamiento no definido cuando el valor de punto flotante es NaN, infinito o demasiado grande para ser representable por el tipo entero del destino. De lo contrario, la conversión a una duración de tipo entero está sujeta a truncamiento como con cualquier static_cast a un tipo de tipo entero.
Ejemplo
Este ejemplo mide el tiempo de ejecución de una función.
#include <iostream>
#include <chrono>
#include <ratio>
#include <thread>
void f()
{
std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main()
{
auto t1 = std::chrono::high_resolution_clock::now();
f();
auto t2 = std::chrono::high_resolution_clock::now();
// duración de punto flotante: no se necesita duration_cast
std::chrono::duration<double, std::milli> fp_ms = t2 - t1;
// duración de tipo entero: requiere duration_cast
auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1);
// convertir la duración de tipo entero a la duración de tipo entero
// de la unidad de tiempo divisible más corta: no se necesita duration_cast
std::chrono::duration<long, std::micro> int_usec = int_ms;
std::cout << "f() tomó " << fp_ms.count() << " ms, "
<< "o " << int_ms.count() << " milisegundos completos "
<< "(que es " << int_usec.count() << " microsegundos completos)" << std::endl;
}
Posible salida:
f() tomó 1000.23 ms, o 1000 milisegundos completos (que es 1000000 microsegundos completos)
Véase también
(C++11) |
Un intervalo de tiempo. (plantilla de clase) |
| Convierte un punto de tiempo a otro punto de tiempo en el mismo reloj, con una duración diferente. (plantilla de función) | |
(C++17) |
Convierte una duración a otra, redondeando hacia abajo. (plantilla de función) |
(C++17) |
Convierte una duración a otra, redondeando hacia arriba. (plantilla de función) |
(C++17) |
Convierte una duración a otra, redondeando al más cercano, se empata con par. (plantilla de función) |