std::saturate_cast
Определено в заголовке <numeric> | ||
|---|---|---|
template< class T, class U > constexpr T saturate_cast( U x ) noexcept; | (с C++26) |
Преобразует значение x в значение типа T, ограничив x между минимальным и максимальным значениями типа T.
Ошибка времени компиляции, если либо T либо U не являются целым типом со знаком или без знака (целые типы), включая стандартные целые типы и расширенные целые типы (с C++11).
Параметры
| x | - | целое значение |
Возвращаемое значение
-
x, еслиxпредставимо как значение типаT. Иначе, - либо наибольшее, либо наименьшее представимое значение типа
T, которое ближе всего к значениюx.
Исключения
Не выбрасывает исключений.
Примечания
| Макрос проверки наличия функции | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_saturation_arithmetic | 202311L | (C++26) | Арифметика насыщения |
Возможная реализация
См. libstdc++ (gcc).
Пример
Можно просмотреть на 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);
}См. также
|
(C++20) | переинтерпретирует представление объекта одного типа как другого (шаблон функции) |
|
(C++17) | ограничивает значение между парой граничных значений (шаблон функции) |
|
(C++20) | проверяет, находится ли целое значение в диапазоне заданного целого типа (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/numeric/saturate_cast