Ce face std::in_range
std::in_range<R>(x) returnează true dacă valoarea lui x poate fi reprezentată exact în tipul R. De exemplu, -1 nu încape într-un unsigned, iar 300 nu încape într-un std::uint8_t.
Comparația se face corect matematic, chiar și între tipuri cu semn și fără semn. Familia include și std::cmp_less, std::cmp_equal etc. Funcționează doar cu tipuri întregi (nu cu bool, char sau numere reale).
Parametri
| Parametru | Descriere |
|---|---|
R |
Tipul țintă. |
t |
Valoarea verificată. |
Ce returnează
true dacă valoarea încape în R, altfel false.
Exemple
Exemplul 1: Verificări înainte de conversie
#include <cstdint>
#include <print>
#include <utility>
int main() {
std::println("-1 în unsigned: {}", std::in_range<unsigned>(-1));
std::println("200 în uint8_t: {}", std::in_range<std::uint8_t>(200));
std::println("300 în uint8_t: {}", std::in_range<std::uint8_t>(300));
std::println("3 miliarde în int: {}", std::in_range<int>(3'000'000'000LL));
}
Rezultat
-1 în unsigned: false
200 în uint8_t: true
300 în uint8_t: false
3 miliarde în int: false
Exemplul 2: Comparația -1 < 1u
Cu operatorul obișnuit, -1 ar fi convertit în unsigned și ar deveni un număr uriaș. std::cmp_less compară valorile reale.
#include <print>
#include <utility>
int main() {
int a = -1;
unsigned b = 1;
std::println("cmp_less(-1, 1u): {}", std::cmp_less(a, b));
std::println("-1 ca unsigned: {}", static_cast<unsigned>(a));
}
Rezultat
cmp_less(-1, 1u): true
-1 ca unsigned: 4294967295
Greșeli frecvente
- Compari direct un
intcu unsize_t(de exemplui < v.size()cuinegativ).-1devine un număr foarte mare și comparația dă rezultat greșit; foloseștestd::cmp_lesssau tipuri potrivite.
Comenzi înrudite
std::numeric_limits: Dă proprietățile unui tip numeric: valoarea maximă și minimă, precizia, dacă are semn, infinitul.static_cast, dynamic_cast, const_cast, reinterpret_cast: Cele patru conversii explicite: static_cast (obișnuite), dynamic_cast (clase), const_cast (const) și reinterpret_cast (biți).std::int32_t: Tipuri întregi cu mărime exactă: int32_t are mereu 32 de biți, uint8_t 8 biți fără semn etc.