Updated:

1 minute read

개요

  • 3방향 비교 연산자
  • 우주선 연산자(spaceship operator)라는 별명이 붙음
  • ‘x <=> y’가 0보다 작으면 ‘x < y’, 크면 ‘x > y’, 같거나 동등하면 ‘x == y’
  • 동등
    • 가로가 2, 세로가 3인 직사각형과 가로가 3, 세로가 2인 직사각형은 서로 다르지만 넓이 기준으로는 동등


예제

  • 코드
     #include <compare>
     #include <cstring>
     #include <iostream>
     #include <string>
        
     using namespace std;
        
     template <typename T> constexpr string type_name() {
     	const string s = __PRETTY_FUNCTION__;
     	const int prefixSize = s.find("[with T = ") + strlen("[with T = ");
        
     	return string(s.data() + prefixSize, s.find(';') - prefixSize);
     }
        
     class Square {
     	private:
     		int x;
     		int y;
        
     	public:
     		Square(int x, int y) : x(x), y(y) {}
        
     		int GetArea() const { return this->x * this->y; }
        
     		weak_ordering operator<=>(const Square &s) const {
     			return this->GetArea() <=> s.GetArea();
     		}
     };
        
     int main() {
     	cout << type_name<decltype(1 <=> 1)>() << endl;
        
     	auto func = [](int x, int y) {
     		if (x <=> y < 0) {
     			cout << "x < y" << endl;
     		} else if (x <=> y > 0) {
     			cout << "x > y" << endl;
     		} else {
     			cout << "x == y" << endl;
     		}
     	};
        
     	func(1, 2);
     	func(2, 1);
     	func(1, 1);
        
     	cout << "------" << endl;
        
     	Square s1{1, 2};
     	Square s2{2, 1};
     	Square s3{3, 3};
        
     	//	cout << s1 <=> s2 << endl;
     	if (s1 <=> s2 == 0) {
     		cout << "s1 <=> s2 == 0" << endl;
     	}
        
     	if (s1 <=> s3 < 0) {
     		cout << "s1 <=> s3 < 0" << endl;
     	}
        
     	return 0;
     }
    
  • 실행 결과
     std::strong_ordering
     x < y
     x > y
     x == y