Namespaces
Variants

std:: saturate_cast

From cppreference.net
Saturation arithmetic
Functions
(C++26)
(C++26)
(C++26)
(C++26)
saturate_cast
(C++26)
Definido en el encabezado <numeric>
template < class T, class U >
constexpr T saturate_cast ( U x ) noexcept ;
(desde C++26)

Convierte el valor x a un valor de tipo T , limitando x entre los valores mínimo y máximo del tipo T .

El programa está mal formado si ya sea T o U no es un tipo entero con signo o sin signo integer type (incluyendo standard integer type y extended integer type ).

Contenidos

Parámetros

x - un valor entero

Valor de retorno

  • x , si x es representable como un valor de tipo T . De lo contrario,
  • o bien el valor representable más grande o más pequeño de tipo T , el que esté más cerca del valor de x .

Notas

Macro de prueba de características Valor Estándar Característica
__cpp_lib_saturation_arithmetic 202311L (C++26) Aritmética de saturación

Implementación posible

Ver libstdc++ (GCC) .

Ejemplo

Se puede previsualizar en Compiler Explorer .

#include <cstdint>
#include <limits>
#include <numeric>
int main()
{
    constexpr std::int16_t x1{696};
    constexpr std::int8_t x2 = std::saturate_cast<std::int8_t>(x1);
    static_assert(x2 == std::numeric_limits<std::int8_t>::max());
    constexpr std::uint8_t x3 = std::saturate_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::saturate_cast<std::int8_t>(y1);
    static_assert(y2 == std::numeric_limits<std::int8_t>::min());
    constexpr std::uint8_t y3 = std::saturate_cast<std::uint8_t>(y1);
    static_assert(y3 == 0);
}

Véase también

(C++20)
reinterpreta la representación de objeto de un tipo como la de otro
(plantilla de función)
(C++17)
restringe un valor entre un par de valores límite
(plantilla de función)
(C++20)
verifica si un valor entero está en el rango de un tipo entero dado
(plantilla de función)