C++20 리서치 - Three Way Comparison(<=>)[4]
c++20에는 새로된 연산자 <=> (three-way comparison operator)가 추가되었습니다.
이 연산자의 의미는 다음과 같습니다.
식 | 의미 |
---|---|
(a <=> b) < 0 | a < b |
(a <=> b) > 0 | a > b |
(a <=> b) == 0 | a == b |
예제
#include <compare>
int a = 10, b = 20;
bool r1 = a < b;
auto r2 = a <=> b;
if (r2 > 0) std::cout << "a > b" << std::endl;
else if (r2 < 0) std::cout << "a < b" << std::endl;
else if (r2 == 0) std::cout << "a == b" << std::endl;
std::cout << typeid(r2).name() << std::endl; //std::string_ordering
어디에 쓰나?
- 사용자 타입을 만든 후 기존 타입과의 비교 operatior 연산자를 오버라이딩 할 때 <=> 를 활용 할 경우 기존 18개 -> 3개 구현으로 코드양이 많이 줄어듭니다.
<=> 연산자의 반환 타입
- std::strong_ordering : 두 비교 대상이 같다.
- std::weak_ordering : 두 비교 대상이 대등하다.(완벽하게 같진 않을 수 있음)
- std::partial_ordering : 비교를 없는 등의 경우의 의미를 나타내기 위해 사용 ( 실수 계산시 NaN 케이스 등 )
#include <compare>
int n1 = 10, n2 = 20;
double d1 = 10, d2 = 20;
auto r1 = n1 <=> n2;
auto r2 = d1 <=> d2;
auto r3 = n1 <=> d2;
if (r1 < 0 ){} // r1 == std::strong_ordering::less
if (r2 > 0 ){} // r1 == std::strong_ordering::greater
if (r3 == 0 ){} // r1 == std::strong_ordering::equal
std::cout << typeid(r1).name() << std::endl; // struct std::strong_ordering
std::cout << typeid(r2).name() << std::endl; // struct std::partial_ordering
std::cout << typeid(r3).name() << std::endl; // struct std::partial_ordering
추가 정보
<=> 연산자는 Rewrite Expression라는 개념을 사용하며 의미는 사용자가 만든 표현식을 컴파일러가 컴파일 시간에 다시 작성한다는 의미입니다.