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, sixest représentable comme une valeur de typeT. 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 dex.
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.
Exécuter ce code
#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) |
|
(C++20) |
vérifie si une valeur entière est dans l'intervalle d'un type entier donné (modèle de fonction) |