Namespaces
Variants

std::cmp_equal, cmp_not_equal, cmp_less, cmp_greater, cmp_less_equal, cmp_greater_equal

cppreference.net에서 가져옴
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 폐지됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
스왑 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
헤더 <utility>
template< class T, class U >
constexpr bool cmp_equal( T t, U u ) noexcept;
에 정의됨 (1) (C++20부터)
template< class T, class U >
constexpr bool cmp_not_equal( T t, U u ) noexcept;
(2) (C++20부터)
template< class T, class U >
constexpr bool cmp_less( T t, U u ) noexcept;
(3) (C++20부터)
template< class T, class U >
constexpr bool cmp_greater( T t, U u ) noexcept;
(4) (C++20부터)
template< class T, class U >
constexpr bool cmp_less_equal( T t, U u ) noexcept;
(5) (C++20부터)
template< class T, class U >
constexpr bool cmp_greater_equal( T t, U u ) noexcept;
(6) (C++20부터)

두 정수 t와 u의 값을 비교합니다. 내장 비교 연산자와 달리, 음의 부호 있는 정수는 항상 부호 없는 정수보다 작으며 (그리고 같지 않습니다). 즉, 비교는 값을 보존하지 않는 정수 변환에 대해 안전합니다.

-1 > 0u; // true
std::cmp_greater(-1, 0u); // false

T 또는 U가 비정수 타입, 문자 타입 또는 bool인 경우 컴파일 타임 오류입니다.

매개변수

t - 왼쪽 인수
u - 오른쪽 인수

반환값

1) true 를 반환합니다, 만약 t 가 u 와 같을 경우.
2) true 를 반환하는 경우는 t 가 u 와 같지 않을 때입니다.
3) true 를 반환하는 경우 t 가 u 보다 작을 때.
4) true 를 반환합니다 t 가 u 보다 큰 경우.
5) true 를 반환합니다 t 가 u 보다 작거나 같은 경우.
6) true 를 반환합니다, 만약 t 가 u 보다 크거나 같은 경우.

가능한 구현

template<class T, class U>
constexpr bool cmp_equal(T t, U u) noexcept
{
    if constexpr (std::is_signed_v<T> == std::is_signed_v<U>)
        return t == u;
    else if constexpr (std::is_signed_v<T>)
        return t >= 0 && std::make_unsigned_t<T>(t) == u;
    else
        return u >= 0 && std::make_unsigned_t<U>(u) == t;
}
template<class T, class U>
constexpr bool cmp_not_equal(T t, U u) noexcept
{
    return !cmp_equal(t, u);
}
template<class T, class U>
constexpr bool cmp_less(T t, U u) noexcept
{
    if constexpr (std::is_signed_v<T> == std::is_signed_v<U>)
        return t < u;
    else if constexpr (std::is_signed_v<T>)
        return t < 0 || std::make_unsigned_t<T>(t) < u;
    else
        return u >= 0 && t < std::make_unsigned_t<U>(u);
}
template<class T, class U>
constexpr bool cmp_greater(T t, U u) noexcept
{
    return cmp_less(u, t);
}
template<class T, class U>
constexpr bool cmp_less_equal(T t, U u) noexcept
{
    return !cmp_less(u, t);
}
template<class T, class U>
constexpr bool cmp_greater_equal(T t, U u) noexcept
{
    return !cmp_less(t, u);
}

참고 사항

이 함수들은 enums ( std::byte 포함), char , char8_t , char16_t , char32_t , wchar_t 그리고 bool 을 비교하는 데 사용할 수 없습니다.

기능 테스트 매크로 값 표준 기능
__cpp_lib_integer_comparison_functions 202002L (C++20) 정수 비교 함수

예제

아래 예제는 적절한 경고 억제 플래그 없이 컴파일할 경우 부호 있는/없는 비교 경고를 발생시킬 수 있습니다. 예를 들어 -Wno-sign-compare (gcc/clang에서 -Wall -Wextra 사용 시, 참고: SO: 특정 경고 비활성화 ).

#include <utility>
// 다음 줄의 주석을 해제하면 "signed/unsigned comparison" 경고가 비활성화됩니다:
// #pragma GCC diagnostic ignored "-Wsign-compare"
int main()
{
    static_assert(sizeof(int) == 4); // precondition
    // 상당히 놀랍게도
    static_assert(-1 > 1U); //< warning: sign-unsign comparison
    // -1이 RHS 타입(`unsigned int`)으로 암시적 변환된 후에는
    // 표현식이 다음과 동일해지기 때문입니다:
    static_assert(0xFFFFFFFFU > 1U);
    static_assert(0xFFFFFFFFU == static_cast<unsigned>(-1));
    // 이와 대조적으로, cmp_* 함수 계열은 예상대로 정수를 비교합니다 -
    // 부호 있는 음수는 항상 부호 없는 정수보다 작은 것으로 비교됩니다:
    static_assert(std::cmp_less(-1, 1U));
    static_assert(std::cmp_less_equal(-1, 1U));
    static_assert(!std::cmp_greater(-1, 1U));
    static_assert(!std::cmp_greater_equal(-1, 1U));
    static_assert(-1 == 0xFFFFFFFFU); //< warning: sign-unsign comparison
    static_assert(std::cmp_not_equal(-1, 0xFFFFFFFFU));
}

참고 항목

x == y 를 구현하는 함수 객체
(클래스 템플릿)
x != y 를 구현하는 함수 객체
(클래스 템플릿)
x < y 를 구현하는 함수 객체
(클래스 템플릿)
x > y 를 구현하는 함수 객체
(클래스 템플릿)
x <= y 를 구현하는 함수 객체
(클래스 템플릿)
x >= y 를 구현하는 함수 객체
(클래스 템플릿)
x == y 를 구현하는 제약된 함수 객체
(클래스)
x != y 를 구현하는 제약된 함수 객체
(클래스)
x < y 를 구현하는 제약된 함수 객체
(클래스)
x > y 를 구현하는 제약된 함수 객체
(클래스)
x <= y 를 구현하는 제약된 함수 객체
(클래스)
x >= y 를 구현하는 제약된 함수 객체
(클래스)
x <=> y 를 구현하는 제약된 함수 객체
(클래스)
(C++20)
정수 값이 주어진 정수 타입의 범위 내에 있는지 확인합니다
(함수 템플릿)
모든 기본 숫자 타입의 속성을 조회하는 인터페이스를 제공합니다
(클래스 템플릿)