Namespaces
Variants

std::chrono:: round (std::chrono::duration)

From cppreference.net
Défini dans l'en-tête <chrono>
template < class ToDuration, class Rep, class Period >
constexpr ToDuration round ( const std:: chrono :: duration < Rep, Period > & d ) ;
(depuis C++17)

Retourne la valeur t représentable dans ToDuration qui est la plus proche de d . S'il existe deux telles valeurs, retourne la valeur paire (c'est-à-dire la valeur t telle que t % 2 == 0 ).

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

d - durée à convertir

Valeur de retour

d arrondi à la durée la plus proche du type ToDuration , en arrondissant au pair 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 Rep, class Period,
         class = std::enable_if_t<detail::is_duration_v<To> &&
                !std::chrono::treat_as_floating_point_v<typename To::rep>>>
constexpr To round(const std::chrono::duration<Rep, Period>& d)
{
    To t0 = std::chrono::floor<To>(d);
    To t1 = t0 + To{1};
    auto diff0 = d - t0;
    auto diff1 = t1 - d;
    if (diff0 == diff1)
    {
        if (t0.count() & 1)
            return t1;
        return t0;
    }
    else if (diff0 < diff1)
        return t0;
    return t1;
}
**Note:** Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés. Seul le texte en dehors des balises de code aurait été traduit, mais dans ce cas, il n'y a pas de texte à traduire en dehors du code.

Exemple

#include <chrono>
#include <iomanip>
#include <iostream>
int main()
{
    using namespace std::chrono_literals;
    std::cout << "Duration\tFloor\tRound\tCeil\n";
    for (using Sec = std::chrono::seconds;
        auto const d : {+4999ms, +5000ms, +5001ms, +5499ms, +5500ms, +5999ms,
                        -4999ms, -5000ms, -5001ms, -5499ms, -5500ms, -5999ms})
        std::cout << std::showpos << d << "\t\t"
                  << std::chrono::floor<Sec>(d) << '\t'
                  << std::chrono::round<Sec>(d) << '\t'
                  << std::chrono::ceil <Sec>(d) << '\n';
}

Sortie :

Duration	Floor	Round	Ceil
+4999ms		+4s	+5s	+5s
+5000ms		+5s	+5s	+5s
+5001ms		+5s	+5s	+6s
+5499ms		+5s	+5s	+6s
+5500ms		+5s	+6s	+6s
+5999ms		+5s	+6s	+6s
-4999ms		-5s	-5s	-4s
-5000ms		-5s	-5s	-5s
-5001ms		-6s	-5s	-5s
-5499ms		-6s	-5s	-5s
-5500ms		-6s	-6s	-5s
-5999ms		-6s	-6s	-5s

Voir aussi

convertit une durée en une autre, avec un intervalle de ticks différent
(modèle de fonction)
convertit une durée en une autre, en arrondissant vers le bas
(modèle de fonction)
convertit une durée en une autre, en arrondissant vers le haut
(modèle de fonction)
convertit un time_point en un 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 les cas médians à l'opposé de zéro
(fonction)