std::saturating_cast
С ru.cppreference.net
| Определена в заголовке <numeric>
|
||
template< class T, class U >
constexpr T saturating_cast( U x ) noexcept;
|
(начиная с C++26) | |
Преобразует значение x в значение типа T, ограничивая x между минимальным и максимальным значениями типа T.
Программа является некорректной, если T или U не является знаковым или беззнаковым целочисленным типом (включая стандартный целочисленный тип и расширенный целочисленный тип).
Параметры
| x | - | целочисленное значение |
Возвращаемое значение
x, еслиxпредставимо как значение типаT. В противном случае,- наибольшее или наименьшее представимое значение типа
T, в зависимости от того, что ближе к значениюx.
Примечания
| Макрос тестирования возможности | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_saturation_arithmetic |
202311L |
(C++26) | Арифметика насыщения |
202603L |
(C++26) | Переименование функций арифметики насыщения |
Возможная реализация
См. libstdc++ (GCC), libc++ (Clang).
Пример
Можно просмотреть на 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);
}
Смотри также
(C++20) |
переинтерпретирует объектное представление одного типа как другого (шаблон функции) |
(C++17) |
ограничивает значение между парой граничных значений (шаблон функции & функциональный объект алгоритма) |
(C++20) |
|
(C++20) |
проверяет, находится ли целочисленное значение в диапазоне заданного целочисленного типа (шаблон функции) |