Namespaces
Variants

std::chrono:: duration_cast

From cppreference.net
Definiert im 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 zu einer Dauer eines anderen Typs ToDuration .

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

Sei

  • 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 ) ,

das Ergebnis ist:

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 ) )

Inhaltsverzeichnis

Parameter

d - umzuwandelnde Dauer

Rückgabewert

d in eine Dauer vom Typ ToDuration konvertiert.

Hinweise

Es werden keine impliziten Konvertierungen verwendet. Multiplikationen und Divisionen werden nach Möglichkeit vermieden, wenn zur Kompilierzeit bekannt ist, dass ein oder mehrere Parameter 1 sind. Berechnungen werden im breitesten verfügbaren Typ durchgeführt und erst nach Abschluss, als ob durch static_cast , in den Ergebnistyp konvertiert.

Das Umwandeln zwischen ganzzahligen Zeitdauern, bei denen die Quellperiode genau durch die Zielperiode teilbar ist (z.B. Stunden in Minuten), oder zwischen Gleitkomma-Zeitdauern kann mit gewöhnlichen Casts oder implizit über std::chrono::duration Konstruktoren erfolgen, kein duration_cast ist erforderlich.

Die Umwandlung von einer Gleitkomma-Dauer in eine Ganzzahldauer ist undefiniertem Verhalten unterworfen , wenn der Gleitkommawert NaN, unendlich oder zu groß für die Darstellung durch den ganzzahligen Zieltyp ist. Andernfalls unterliegt die Umwandlung in eine Ganzzahldauer einer Abschneidung wie bei jeder static_cast auf einen Ganzzahltyp.

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)

Siehe auch

(C++11)
ein Zeitintervall
(Klassentemplate)
konvertiert einen Zeitpunkt zu einem anderen Zeitpunkt auf derselben Uhr, mit einer anderen Dauer
(Funktionstemplate)
konvertiert eine Dauer zu einer anderen, abrundend
(Funktionstemplate)
konvertiert eine Dauer zu einer anderen, aufrundend
(Funktionstemplate)
konvertiert eine Dauer zu einer anderen, rundend zur nächsten, bei Gleichheit zur geraden Zahl
(Funktionstemplate)