template <class ToDuration, class Rep, class Period> constexpr ToDuration duration_cast(const duration<Rep,Period>& d); | (since C++11) |
Converts a std::chrono::duration
to a duration of different type ToDuration
.
No implicit conversions are used. Multiplications and divisions are avoided where possible, if it is known at compile time that one or more parameters are 1
. Computations are done in the widest type available and converted, as if by static_cast
, to the result type only when finished.
d | - | duration to convert |
d
converted to a duration of type ToDuration
.
The function does not participate in overload resolution unless ToDuration
is an instance of std::chrono::duration
.
Casting between integer durations where the source period is exactly divisible by the target period (e.g. hours to minutes) or between floating-point durations can be performed with ordinary casts or implicitly via std::chrono::duration constructors, no duration_cast
is needed.
Casting from a floating-point duration to an integer duration is subject to undefined behavior when the floating-point value is NaN, infinity, or too large to be representable by the target's integer type. Otherwise, casting to an integer duration is subject to truncation as with any static_cast to an integer type.
This example measures the execution time of a function.
#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(); // floating-point duration: no duration_cast needed std::chrono::duration<double, std::milli> fp_ms = t2 - t1; // integral duration: requires duration_cast 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 std::chrono::duration<long, std::micro> int_usec = int_ms; std::cout << "f() took " << fp_ms.count() << " ms, " << "or " << int_ms.count() << " whole milliseconds " << "(which is " << int_usec.count() << " whole microseconds)" << std::endl; }
Possible output:
f() took 1000.23 ms, or 1000 whole milliseconds (which is 1000000 whole microseconds)
converts a time point to another time point on the same clock, with a different duration (function template) |
|
(C++17) | converts a duration to another, rounding down (function template) |
(C++17) | converts a duration to another, rounding up (function template) |
(C++17) | converts a duration to another, rounding to nearest, ties to even (function template) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/cpp/chrono/duration/duration_cast