in_range — std::in_range

in_range — std::in_range

std::in_ranget가 타입 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 도구예요.

더 알아보기 (Learn more)

cppreference