Namespaces
Variants

std::saturating_cast

Depuis fr.cppreference.net
 
 
 
 
Défini dans l'en-tête <numeric>
template< class T, class U >
constexpr T saturating_cast( U x ) noexcept;
(depuis C++26)

Convertit la valeur x en une valeur de type T, en limitant x entre les valeurs minimale et maximale du type T.

Le programme est mal formé si T ou U n'est pas un type entier signé ou non signé (y compris type entier standard et type entier étendu).

Paramètres

x - une valeur entière

Valeur de retour

  • x, si x est représentable comme une valeur de type T. Sinon,
  • soit la plus grande ou la plus petite valeur représentable de type T, selon celle qui est la plus proche de la valeur de x.

Notes

Test de fonctionnalité macro Valeur Std Fonctionnalité
__cpp_lib_saturation_arithmetic 202311L (C++26) Arithmétique saturante
202603L (C++26) Renommage des fonctions d'arithmétique saturante

Implémentation possible

Voir libstdc++ (GCC), libc++ (Clang).

Exemple

Peut être prévisualisé sur Compiler Explorer.

#include <cstdint>
#include <limits>
#include <numeric>

int main()
{
    constexpr std::int16_t x1{696};

    constexpr std::int8_t x2 = std::saturating_cast<std::int8_t>(x1);
    static_assert(x2 == std::numeric_limits<std::int8_t>::max());

    constexpr std::uint8_t x3 = std::saturating_cast<std::uint8_t>(x1);
    static_assert(x3 == std::numeric_limits<std::uint8_t>::max());

    constexpr std::int16_t y1{-696};

    constexpr std::int8_t y2 = std::saturating_cast<std::int8_t>(y1);
    static_assert(y2 == std::numeric_limits<std::int8_t>::min());

    constexpr std::uint8_t y3 = std::saturating_cast<std::uint8_t>(y1);
    static_assert(y3 == 0);
}

Voir aussi

(C++20)
réinterprète la représentation objet d'un type comme celle d'un autre
(modèle de fonction)
(C++17)
limite une valeur entre une paire de valeurs limites
(modèle de fonction & objet fonction d'algorithme)
(C++20)
vérifie si une valeur entière est dans l'intervalle d'un type entier donné
(modèle de fonction)