Namensräume
Varianten
Aktionen

std::chrono::round(std::chrono::time_point)

Von cppreference.com
< cpp‎ | chrono‎ | time point
 
 
 
 
Definiert in Header <chrono>
template< class ToDuration, class Clock, class Duration >

constexpr std::chrono::time_point<Clock, ToDuration>

    round( const std::chrono::time_point<Clock, Duration>& tp );
(seit C++17)

Gibt den nächstgelegenen Zeitpunkt zurück, der in ToDuration darstellbar ist, gerundet auf die nächste gerade Zahl im Halbierungsfall.

Die Funktion nimmt nicht an der Überladungsauflösung teil, es sei denn, ToDuration ist eine Spezialisierung von std::chrono::duration und std::chrono::treat_as_floating_point_v<typename ToDuration::rep> ist false.

Inhalt

[edit] Parameter

tp - Zeitpunkt, der auf den nächsten Wert gerundet werden soll

[edit] Rückgabewert

tp, gerundet auf den nächstgelegenen Zeitpunkt mit der Dauer vom Typ ToDuration, gerundet auf die nächste gerade Zahl im Halbierungsfall.

[edit] Mögliche Implementierung

namespace detail
{
    template<class> inline constexpr bool is_duration_v = false;
    template<class Rep, class Period> inline constexpr bool is_duration_v<
        std::chrono::duration<Rep, Period>> = true;
}
 
template<class To, class Clock, class FromDuration,
         class = std::enable_if_t<detail::is_duration_v<To> &&
                !std::chrono::treat_as_floating_point_v<typename To::rep>>>
constexpr std::chrono::time_point<Clock, To> round(
    const std::chrono::time_point<Clock, FromDuration>& tp)
{
    return std::chrono::time_point<Clock, To>{
        std::chrono::round<To>(tp.time_since_epoch())};
}

[edit] Beispiel

#include <chrono>
#include <iostream>
#include <string>
 
template<typename TimePoint>
std::string to_string(const TimePoint& time_point)
{
    return std::to_string(time_point.time_since_epoch().count());
}
 
int main()
{
    using namespace std::literals::chrono_literals;
    using Sec = std::chrono::seconds;
 
    std::cout << "Time point\t" "Cast\t" "Floor\t" "Round\t" "Ceil\n";
    std::cout << "(ms)\t\t"     "(s)\t"  "(s)\t"   "(s)\t"   "(s)\n";
    for (const auto value_ms : {5432ms, 5678ms})
    {
        std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>
            time_point_ms(value_ms);
 
        std::cout
            << to_string(time_point_ms) << "\t\t"
            << to_string(std::chrono::time_point_cast<Sec>(time_point_ms)) << '\t'
            << to_string(std::chrono::floor<Sec>(time_point_ms)) << '\t'
            << to_string(std::chrono::round<Sec>(time_point_ms)) << '\t'
            << to_string(std::chrono::ceil<Sec>(time_point_ms)) << '\n';
    }
}

Ausgabe

Time point	Cast	Floor	Round	Ceil
(ms)		(s)	(s)	(s)	(s)
5432		5	5	5	6
5678		5	5	6	6

[edit] Siehe auch

konvertiert einen Zeitpunkt in einen anderen auf derselben Uhr mit einer anderen Dauer
(Funktionstemplate) [edit]
konvertiert einen Zeitpunkt in einen anderen und rundet auf
(Funktionstemplate) [edit]
konvertiert einen Zeitpunkt in einen anderen und rundet ab
(Funktionstemplate) [edit]
konvertiert eine Dauer in eine andere, rundet auf die nächste, bei Gleichstand zu geraden Zahlen
(Funktionstemplate) [edit]
(C++11)(C++11)(C++11)(C++11)(C++11)(C++11)(C++11)(C++11)(C++11)
nächste ganze Zahl, Rundung weg von Null bei Halbwertigkeiten
(Funktion) [bearbeiten]