Namensräume
Varianten
Aktionen

std::chrono::duration_cast

Von cppreference.com
< cpp‎ | chrono‎ | duration
 
 
 
 
Definiert in Header <chrono>
template< class ToDuration, class Rep, class Period >
constexpr ToDuration duration_cast( const std::chrono::duration<Rep, Period>& d );
(seit C++11)

Konvertiert eine std::chrono::duration in eine Dauer eines anderen Typs ToDuration.

Die Funktion nimmt nur an der Überladungsauflösung teil, wenn ToDuration eine Spezialisierung von std::chrono::duration ist.

Seien

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

ist das Ergebnis

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

Inhalt

[edit] Parameter

d - zu konvertierende Dauer

[edit] Rückgabewert

d konvertiert in eine Dauer vom Typ ToDuration.

[edit] Anmerkungen

Es werden keine impliziten Konvertierungen verwendet. Multiplikationen und Divisionen werden vermieden, wo immer möglich, wenn zur Kompilierzeit bekannt ist, dass einer oder mehrere Parameter 1 sind. Berechnungen erfolgen im breitesten verfügbaren Typ und werden, als ob sie mittels static_cast erfolgten, erst nach Abschluss in den Ergebnistyp konvertiert.

Konvertierungen zwischen Ganzzahldauern, bei denen die Quellperiode exakt durch die Zielperiode teilbar ist (z. B. Stunden in Minuten) oder zwischen Fließkommadauern, können mit gewöhnlichen Konvertierungen oder implizit über std::chrono::duration Konstruktoren erfolgen, ohne dass duration_cast benötigt wird.

Die Konvertierung von einer Fließkommadauer in eine Ganzzahldauer ist undefiniertem Verhalten unterworfen, wenn der Fließkommawert NaN, unendlich oder zu groß ist, um ihn durch den Ganzzahltyp des Ziels darstellen zu können. Ansonsten unterliegt die Konvertierung in eine Ganzzahldauer der Abschneidung, wie bei jeder static_cast in einen Ganzzahltyp.

[edit] Beispiel

Dieses Beispiel misst die Ausführungszeit einer Funktion.

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

Mögliche Ausgabe

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

[edit] Siehe auch

(C++11)
Ein Zeitintervall
(Klassen-Template) [bearbeiten]
konvertiert einen Zeitpunkt in einen anderen auf derselben Uhr mit einer anderen Dauer
(Funktionstemplate) [edit]
konvertiert eine Dauer in eine andere und rundet ab
(Funktionstemplate) [edit]
konvertiert eine Dauer in eine andere und rundet auf
(Funktionstemplate) [edit]
konvertiert eine Dauer in eine andere, rundet auf die nächste, bei Gleichstand zu geraden Zahlen
(Funktionstemplate) [edit]