in_range — std::in_range
in_range — std::in_range
std::in_range는 값 t가 타입 R로 표현할 수 있는 값의 범위 안에 있는지를 검사하는 함수예요. C++20에서 도입됐어요. <utility> 헤더에 있어요.
부호 있는/부호 없는 정수 변환에서 값 손실 없이 변환 가능한지 확인할 때 유용해요.
출처: cppreference
본문
// <utility> 헤더, C++20
template< class R, class T >
constexpr bool in_range( T t ) noexcept;
t의 값이 R 타입(통상 int/size_t 등)으로 표현 가능한 범위에 있으면 true.
사용 예
#include <utility>
#include <cstdint>
// int를 size_t로 안전하게 변환 가능한지
int n = -1;
bool ok = std::in_range<std::size_t>(n); // false (음수)
int m = 5;
std::size_t s = static_cast<std::size_t>(m);
bool ok2 = std::in_range<std::size_t>(m); // true
unsigned int big = 4000000000u;
bool ok3 = std::in_range<int>(big); // false (int 범위 초과)
활용 — 안전한 변환
static_cast로 타입을 줄일 때 값이 손실될 위험을 미리 검사.
template<typename To, typename From>
bool safe_convert(From f, To& out) {
if (!std::in_range<To>(f)) return false;
out = static_cast<To>(f);
return true;
}
특징
- 부호 있는 ↔ 부호 없는 정수 간 범위 검사를 안전하게 수행.
constexpr,noexcept— 컴파일 타임 확인 가능.- 오버플로/언더플로 없이 "범위에 드는가"를 판단.
std::in_range는 정수 타입 간 변환 전에 값이 안전하게 들어가는지 검사해, 축소 변환의 버그를 방지하는 C++20 도구예요.