std:: cmp_equal, cmp_not_equal, cmp_less, cmp_greater, cmp_less_equal, cmp_greater_equal
|
헤더 파일에 정의됨
<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 | - | 오른쪽 인수 |
반환값
가능한 구현
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
를 구현하는 함수 객체
(클래스 템플릿) |
|
|
(C++20)
|
x == y
를 구현하는 제약된 함수 객체
(클래스) |
|
(C++20)
|
x != y
를 구현하는 제약된 함수 객체
(클래스) |
|
(C++20)
|
x < y
를 구현하는 제약된 함수 객체
(클래스) |
|
(C++20)
|
x > y
를 구현하는 제약된 함수 객체
(클래스) |
|
(C++20)
|
x <= y
를 구현하는 제약된 함수 객체
(클래스) |
|
(C++20)
|
x >= y
를 구현하는 제약된 함수 객체
(클래스) |
|
(C++20)
|
x <=> y
를 구현하는 제약된 함수 객체
(클래스) |
|
(C++20)
|
정수 값이 주어진 정수 타입의 범위 내에 있는지 확인합니다
(함수 템플릿) |
|
모든 기본 숫자 타입의 속성을 조회하는 인터페이스를 제공합니다
(클래스 템플릿) |