👨🏻‍💻 programming/◽ c, c++

(c++20) [Three-way Comparsion(3방향 비교 연산자)/우주선] 연산자

핑크코냥 2024. 6. 14. 17:21
728x90

 

"(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 훑어보기 중.

 

728x90