Namensräume
Varianten
Aktionen

operator+,-,*,/,%(std::chrono::duration)

Von cppreference.com
< cpp‎ | chrono‎ | duration
 
 
 
 
template< class Rep1, class Period1, class Rep2, class Period2 >

typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type
    constexpr operator+( const duration<Rep1,Period1>& lhs,

                         const duration<Rep2,Period2>& rhs );
(1) (seit C++11)
template< class Rep1, class Period1, class Rep2, class Period2 >

typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type
    constexpr operator-( const duration<Rep1,Period1>& lhs,

                         const duration<Rep2,Period2>& rhs );
(2) (seit C++11)
template< class Rep1, class Period, class Rep2 >

duration<typename std::common_type<Rep1,Rep2>::type, Period>
    constexpr operator*( const duration<Rep1,Period>& d,

                         const Rep2& s );
(3) (seit C++11)
template< class Rep1, class Rep2, class Period >

duration<typename std::common_type<Rep1,Rep2>::type, Period>
    constexpr operator*( const Rep1& s,

                         const duration<Rep2,Period>& d );
(4) (seit C++11)
template< class Rep1, class Period, class Rep2 >

duration<typename std::common_type<Rep1,Rep2>::type, Period>
    constexpr operator/( const duration<Rep1,Period>& d,

                         const Rep2& s );
(5) (seit C++11)
template< class Rep1, class Period1, class Rep2, class Period2 >

typename std::common_type<Rep1,Rep2>::type
    constexpr operator/( const duration<Rep1,Period1>& lhs,

                         const duration<Rep2,Period2>& rhs );
(6) (seit C++11)
template< class Rep1, class Period, class Rep2 >

duration<typename std::common_type<Rep1,Rep2>::type, Period>
    constexpr operator%( const duration<Rep1, Period>& d,

                         const Rep2& s );
(7) (seit C++11)
template< class Rep1, class Period1, class Rep2, class Period2 >

typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type
    constexpr operator%( const duration<Rep1,Period1>& lhs,

                         const duration<Rep2,Period2>& rhs );
(8) (seit C++11)

Führt grundlegende arithmetische Operationen zwischen zwei Zeitdauern oder zwischen einer Zeitdauer und einer Taktanzahl durch.

1) Konvertiert die beiden Zeitdauern in ihren gemeinsamen Typ und erstellt eine Zeitdauer, deren Taktanzahl die Summe der Taktanzahlen nach der Konvertierung ist.
2) Konvertiert die beiden Zeitdauern in ihren gemeinsamen Typ und erstellt eine Zeitdauer, deren Taktanzahl die rhs-Anzahl von Takten ist, die von der lhs-Anzahl von Takten nach der Konvertierung subtrahiert wird.
3,4) Konvertiert die Zeitdauer d in eine, deren rep der gemeinsame Typ zwischen Rep1 und Rep2 ist, und multipliziert die Anzahl der Takte nach der Konvertierung mit s. Diese Überladungen nehmen nur an der Auflösung der Überladung teil, wenn s konvertierbar in typename std::common_type<Rep1, Rep2>::type ist.
5) Konvertiert die Zeitdauer d in eine, deren rep der gemeinsame Typ zwischen Rep1 und Rep2 ist, und teilt die Anzahl der Takte nach der Konvertierung durch s. Diese Überladung nimmt nur an der Auflösung der Überladung teil, wenn s konvertierbar in typename std::common_type<Rep1, Rep2>::type ist und Rep2 keine Spezialisierung von duration ist.
6) Konvertiert die beiden Zeitdauern in ihren gemeinsamen Typ und teilt die Taktanzahl von lhs nach der Konvertierung durch die Taktanzahl von rhs nach der Konvertierung. Beachten Sie, dass der Rückgabewert dieses Operators keine Zeitdauer ist.
7) Konvertiert die Zeitdauer d in eine, deren rep der gemeinsame Typ zwischen Rep1 und Rep2 ist, und erstellt eine Zeitdauer, deren Taktanzahl der Rest der Division der Taktanzahl nach der Konvertierung durch s ist. Diese Überladung nimmt nur an der Auflösung der Überladung teil, wenn s konvertierbar in typename std::common_type<Rep1, Rep2>::type ist und Rep2 keine Spezialisierung von duration ist.
8) Konvertiert die beiden Zeitdauern in ihren gemeinsamen Typ und erstellt eine Zeitdauer, deren Taktanzahl der Rest der Taktanzahlen nach der Konvertierung ist.

Inhalt

[edit] Parameter

lhs - Zeitdauer auf der linken Seite des Operators
rhs - Zeitdauer auf der rechten Seite des Operators
d - das Zeitdauerargument für gemischte Operatoren
s - Nicht-Zeitdauer-Argument für gemischte Operatoren

[edit] Rückgabewert

Angenommen, CD ist der Rückgabetyp der Funktion und CD<A, B> = std::common_type<A, B>::type, dann

1) CD(CD(lhs).count() + CD(rhs).count())
2) CD(CD(lhs).count() - CD(rhs).count())
3,4) CD(CD(d).count() * s)
5) CD(CD(d).count() / s)
6) CD(lhs).count() / CD(rhs).count() (der Rückgabetyp dieses Operators ist keine Zeitdauer)
7) CD(CD(d).count() % s)
8) CD(CD(lhs).count() % CD(rhs).count())

[edit] Beispiel

#include <chrono>
#include <iostream>
 
int main()
{
    // Simple arithmetic:
    std::chrono::seconds s = std::chrono::hours(1)
                           + 2 * std::chrono::minutes(10)
                           + std::chrono::seconds(70) / 10;
    std::cout << "1 hour + 2*10 min + 70/10 sec = " << s << " (seconds)\n";
 
    using namespace std::chrono_literals;
 
    // Difference between dividing a duration by a number
    // and dividing a duration by another duration:
    std::cout << "Dividing that by 2 minutes gives "
              << s / 2min << '\n'
              << "Dividing that by 2 gives "
              << (s / 2).count() << " seconds\n";
 
    // The remainder operator is useful in determining where
    // in a time frame is this particular duration, e.g. to
    // break it down into hours, minutes, and seconds:
    std::cout << s << " (seconds) = "
              << std::chrono::duration_cast<std::chrono::hours>(
                 s) << " (hour) + "
              << std::chrono::duration_cast<std::chrono::minutes>(
                 s % 1h) << " (minutes) + "
              << std::chrono::duration_cast<std::chrono::seconds>(
                 s % 1min) << " (seconds)\n";
 
    constexpr auto sun_earth_distance{150'000'000ULL}; // km
    constexpr auto speed_of_light{300000ULL}; // km/sec
    std::chrono::seconds t(sun_earth_distance / speed_of_light); // sec
    std::cout << "A photon flies from the Sun to the Earth in "
              << t / 1min << " minutes " << t % 1min << " (seconds)\n";
}

Ausgabe

1 hour + 2*10 min + 70/10 sec = 4807s (seconds)
Dividing that by 2 minutes gives 40
Dividing that by 2 gives 2403 seconds
4807s (seconds) = 1h (hour) + 20min (minutes) + 7s (seconds)
A photon flies from the Sun to the Earth in 8 minutes 20s (seconds)

[edit] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3050 C++11 Konvertierbarkeitsbeschränkung verwendete nicht-const xvalue Verwenden Sie stattdessen const lvalues