Namespaces
Variants

std:: saturate_cast

From cppreference.net
Saturation arithmetic
Functions
(C++26)
(C++26)
(C++26)
(C++26)
saturate_cast
(C++26)
ヘッダーで定義 <numeric>
template < class T, class U >
constexpr T saturate_cast ( U x ) noexcept ;
(C++26以降)

x を型 T の値に変換し、 x を型 T の最小値と最大値の間でクランプします。

T または U のいずれかが符号付きまたは符号なしの 整数型 標準整数型 および 拡張整数型 を含む)でない場合、プログラムは不適格です。

目次

パラメータ

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)
整数値が指定された整数型の範囲内にあるかどうかをチェックする
(関数テンプレート)