Namespaces
Variants

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

From cppreference.net
Utilities library
General utilities
Relational operators (deprecated in C++20)
Integer comparison functions
cmp_equal cmp_less cmp_less_than
(C++20) (C++20) (C++20)
cmp_not_equal cmp_greater cmp_greater_than
(C++20) (C++20) (C++20)
(C++20)
Swap and type operations
Common vocabulary types
(C++11)
(C++17)
(C++17)
(C++17)


헤더 파일에 정의됨 <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; // 참
std::cmp_greater(-1, 0u); // 거짓

다음 중 하나라도 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)
정수 값이 주어진 정수 타입의 범위 내에 있는지 확인합니다
(함수 템플릿)
모든 기본 숫자 타입의 속성을 조회하는 인터페이스를 제공합니다
(클래스 템플릿)