1 분 소요

개요

  • 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