"(c++20) Three-way Comparsion(3방향 비교 연산자)/우주선"
c++20에 추가된 것 중에 아주 편안한 연산자 오버로딩이 생겼다. !!
지금은 아니더라도(?) 아주 유용하게 쓰일 거 같은 녀석이라서 정리해본다.
class나 struct를 만들어서 그 객체끼리 비교를 하기 위해서는 필요에 따라 [ '<' '<=' '>' '>=' '==' '!=' : 6개] 연산자 오버로딩을 해야한다. 하지만 여기서 c++20에 추가된 <=> Three-way Comparsion 연산자를 사용하면 6개를 포함한 operator하나만 정의하면 된다.
#include <iostream>
using namespace std;
struct Myoperator
{
Myoperator(int value) : _value(value)
{
}
//auto operator <=>(const Myoperator& rhs) const { return _value <=> rhs._value; }
auto operator <=>(const Myoperator& rhs) const = default;
bool operator<(const Myoperator& rhs/*RightHandSize*/) const
{
return _value < rhs._value;
}
int _value;
};
int main()
{
Myoperator a = 1;
Myoperator b = 2;
bool test = a < b;
bool test2 = a > b;
bool test3 = a <= b;
}
1. 3방향 비교 연산자 형태
기존과 그대로 연산자 오버로딩을 할 때 함수 선언 방법은 같다.
"(리턴 타입) operator(연산자) (연산자가 받는 인자)"
→ auto operator <=>(const Myoperator& rhs) const = default;
* rhs: RightHandSize /*의미는 없음*/
2. 리턴 타입
위 코드는 auto라고 적어뒀지만, 3방향 비교 연산자의 리턴 타입은 3종류가 있다.
relational | equivalence | comparable | |
strong ordering | o | o | o |
weak ordering | o | x | o |
partical ordering | o | x | x |
- relational: 6종 비교 연산 지원 ==, !=, <, <=, >, >=
- equivalence: 모든 Equivalent한 값들은 서로 구분되지 않고 완전 똑같다
- comparable: a < b, a == b, a > b 중 하나는 참이다.
예시 코드는 value 하나만 비교하기 때문에 relational, equivalence, comparable 이 3가지의 조건을 모두 통과하기 때문에 auto는 즉, std::strong_ordering이다.
또한, 만약 한 클래스 또는 struct 비교 변수에 strong, partial, weak ordeing 변수들이 각각 있다고 했을 때, 우주선 연산자를 auto를 사용 오버로딩하게 되면 partical_ordering이 된다. partial변수로 인해 Strong 이나 waak로 ordering이 만들어 질 수 없다는 제약이 생긴다.
게임으로 예를 들면, (롤 LOL) 에서 방 만들어서 랭크 돌릴 때, Strong: 다이아, Weak: 에메랄드 Partial: 골드 이면 --> 랭크 불가능하다. 골드와 다이아는 함께 랭크를 할 수 없다는 제약이 생기기 때문이다.
3. 변수 비교
int a1 = 100;
int a2 = 200;
auto ret = (a1 <=> a2);
if (ret < 0)
{
cout << "a<b" << endl;
}
else if (ret == 0)
{
cout << "a==b" << endl;
}
else if (ret > 0)
{
cout << "a>b" << endl;
}
[ '<' '<=' '>' '>=' '==' '!=' : 6개] 연산자는 bool값으로 true, false를 내뱉었다면, [<=>] 연산자는 -1, 0, 1로 비교한다.

빠이용 ~
내용 출저: 인프런 Inflearn - Rookiss 쌤 강의인 C++20 훑어보기 중.
'👨🏻💻 programming > ◽ c, c++' 카테고리의 다른 글
(c++20) STL::Container #1 - std::to_array, erase, erase_if (0) | 2024.06.17 |
---|---|
(c++20) Conditional Explicit Constructor (0) | 2024.06.17 |
(c++20) consteval, constinit (0) | 2024.06.14 |
[c++17] 전문자를 위한 c++17 새로운 내용 북마크 (0) | 2024.03.11 |
[C++] Map의 Key로 Class/Struct 넣기 (2) | 2023.08.11 |
안 하는 것 보다 낫겠지
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!