std::totally_ordered
std::totally_ordered (완전 순서 개념)
타입 T(또는 두 타입)의 비교 연산자들이 완전 순서(total order)를 구성하는지 명세하는 개념(concept)이에요. <, <=, >, >=, ==, != 비교의 일관성을 요구해요. C++20부터 있어요.
출처: cppreference
본문
<concepts> 헤더에 정의돼 있어요.
template< class T >
concept totally_ordered =
std::equality_comparable<T> &&
__PartiallyOrderedWith<T, T>; // (1)
template< class T, class U >
concept totally_ordered_with =
std::totally_ordered<T> &&
std::totally_ordered<U> &&
std::common_reference_with<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&> &&
totally_ordered<
std::common_reference_t<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>> &&
__PartiallyOrderedWith<T, U>; // (2)
totally_ordered는 equality_comparable(동등 비교 가능)과 부분 순서 관계 개념을 결합해 완전 순서를 요구해요. 완전 순서는 다음 성질을 만족하는 이항 관계예요.
- 비반사적(irreflexive) 및 비대칭적(asymmetric),
- 추이적(transitive),
- 비교 가능성(comparability): 어떤 두 원소
a,b도a < b,a == b,a > b중 정확히 하나를 만족. 즉 모든 원소 쌍이 서로 비교 가능해야 해요.
완전 순서는 엄밀 약순서보다 강한 개념이에요. 동치 클래스가 항상 단일 원소여야 하므로, "y보다 작은 x도 없고 x와 같은 것도 아닌" 모호한 상황이 없어요. 정렬, 검색, 극값 계산 등에 안전하게 쓸 수 있는 비교 성질이에요.
두 타입을 비교하는 totally_ordered_with<T, U>는 각각 완전 순서이고 공통 참조를 가지며, 공통 참조 타입으로 변환해 비교한 결과가 원래 비교와 일관적인지를 요구해요.
참고 문헌
- C++23 표준 (ISO/IEC 14882:2024): 18.5.6 Concept totally_ordered [concept.totallyordered]
- C++20 표준 (ISO/IEC 14882:2020): 18.5.5 Concept totally_ordered [concept.totallyordered]