Namespaces
Variants

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

From cppreference.net
Défini dans l'en-tête <chrono>
template < class ToDuration, class Clock, class Duration >

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

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

Retourne le point temporel le plus proche de tp représentable dans ToDuration , en arrondissant au pair dans les cas à mi-chemin.

La fonction ne participe pas à la résolution de surcharge sauf si ToDuration est une spécialisation de std::chrono::duration et que std:: chrono :: treat_as_floating_point_v < typename ToDuration :: rep > est false .

Table des matières

Paramètres

tp - point temporel à arrondir au plus proche

Valeur de retour

tp arrondi au point temporel le plus proche en utilisant la durée de type ToDuration , avec arrondi à la valeur paire dans les cas à mi-chemin.

Implémentation possible

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> arrondir(
    const std::chrono::time_point<Clock, FromDuration>& tp)
{
    return std::chrono::time_point<Clock, To>{
        std::chrono::round<To>(tp.time_since_epoch())};
}

Exemple

#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 << "Point temporel\t" "Conversion\t" "Troncature\t" "Arrondi\t" "Plafond\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';
    }
}

Sortie :

Point temporel	Conversion	Troncature	Arrondi	Plafond
(ms)		(s)	(s)	(s)	(s)
5432		5	5	5	6
5678		5	5	6	6

Voir aussi

convertit un point temporel en un autre point temporel sur la même horloge, avec une durée différente
(modèle de fonction)
convertit un time_point en un autre, en arrondissant vers le haut
(modèle de fonction)
convertit un time_point en un autre, en arrondissant vers le bas
(modèle de fonction)
convertit une durée en une autre, en arrondissant au plus proche, les cas médians vers le pair
(modèle de fonction)
(C++11) (C++11) (C++11) (C++11) (C++11) (C++11) (C++11) (C++11) (C++11)
entier le plus proche, en arrondissant à l'opposé de zéro dans les cas médians
(fonction)