🧼C, C++/기초및 입문

우주선 연산자 '<=>' 사용법 ( C++20 )

Mawile 2021. 6. 19.
728x90

 

개발환경 >> Visual Studio 2022

언어 >> C++20

운영체제 >> Windows10

 


 

안녕하세요!!

이번에 C++20에서 새로나온 연산자인 "<=>" 이 연산자에 대한 설명과 사용법을 적어보겠습니다!

 

우선은 이 연산자의 정식명칭은 "SpaceShip (Three-way Comparison) operator"라고 합니다.

해석하자면 "우주선 연산자"입니다.

 

이 연산자는 (a <=> b) 라고 주어졌을때,
a와 b가 같은지, 다른지, a가큰지 b가 작은지등등 값의 대소와 값비교를 한번에 다 해버릴수가있습니다.

 

그리고 반환값이 좀 특이한데, 반환하는 녀석은 이녀석입니다.

struct strong_ordering {
    static const strong_ordering less;
    static const strong_ordering equal;
    static const strong_ordering equivalent;
    static const strong_ordering greater;

    constexpr operator partial_ordering() const noexcept {
        return {static_cast<_Compare_t>(_Value)};
    }

    constexpr operator weak_ordering() const noexcept {
        return {static_cast<_Compare_t>(_Value)};
    }

    _NODISCARD friend constexpr bool operator==(const strong_ordering _Val, _Literal_zero) noexcept {
        return _Val._Value == 0;
    }

    _NODISCARD friend constexpr bool operator==(strong_ordering, strong_ordering) noexcept = default;

    _NODISCARD friend constexpr bool operator<(const strong_ordering _Val, _Literal_zero) noexcept {
        return _Val._Value < 0;
    }

    _NODISCARD friend constexpr bool operator>(const strong_ordering _Val, _Literal_zero) noexcept {
        return _Val._Value > 0;
    }

    _NODISCARD friend constexpr bool operator<=(const strong_ordering _Val, _Literal_zero) noexcept {
        return _Val._Value <= 0;
    }

    _NODISCARD friend constexpr bool operator>=(const strong_ordering _Val, _Literal_zero) noexcept {
        return _Val._Value >= 0;
    }

    _NODISCARD friend constexpr bool operator<(_Literal_zero, const strong_ordering _Val) noexcept {
        return _Val > 0;
    }

    _NODISCARD friend constexpr bool operator>(_Literal_zero, const strong_ordering _Val) noexcept {
        return _Val < 0;
    }

    _NODISCARD friend constexpr bool operator<=(_Literal_zero, const strong_ordering _Val) noexcept {
        return _Val >= 0;
    }

    _NODISCARD friend constexpr bool operator>=(_Literal_zero, const strong_ordering _Val) noexcept {
        return _Val <= 0;
    }

    _NODISCARD friend constexpr strong_ordering operator<=>(const strong_ordering _Val, _Literal_zero) noexcept {
        return _Val;
    }

    _NODISCARD friend constexpr strong_ordering operator<=>(_Literal_zero, const strong_ordering _Val) noexcept {
        return {static_cast<_Compare_t>(-_Val._Value)};
    }

    _Compare_t _Value;
};

 

"strong_ordering"이라는 구조체입니다.

 

그러면 사용법 바로 가시죠!

void SpaceShip() {
	auto item = 5 <=> 4;
	std::cout << std::boolalpha << std::is_lt(item);
}

int main() {
	SpaceShip();
	_getch();
}

 

다음은 우주선연산자를 사용한 기본적인 예시입니다.

std::is_lt는 "a <=> b" 에서 a가 b보다 작은가?? 를 물어보는 함수입니다.

한마디로 5가 4보다 크므로, 결과값은 "false"가 됩니다.

 

 

그러면 이러한 대소비교를 하기위한 함수를 모두 알려드리겠습니다!

// FUNCTION is_eq
_NODISCARD constexpr bool is_eq(const partial_ordering _Comp) noexcept {
    return _Comp == 0;
}

// FUNCTION is_neq
_NODISCARD constexpr bool is_neq(const partial_ordering _Comp) noexcept {
    return _Comp != 0;
}

// FUNCTION is_lt
_NODISCARD constexpr bool is_lt(const partial_ordering _Comp) noexcept {
    return _Comp < 0;
}

// FUNCTION is_lteq
_NODISCARD constexpr bool is_lteq(const partial_ordering _Comp) noexcept {
    return _Comp <= 0;
}

// FUNCTION is_gt
_NODISCARD constexpr bool is_gt(const partial_ordering _Comp) noexcept {
    return _Comp > 0;
}

// FUNCTION is_gteq
_NODISCARD constexpr bool is_gteq(const partial_ordering _Comp) noexcept {
    return _Comp >= 0;
}

 

 

차례대로 설명하자면,

std::is_eq => a == b 일시 참
std::is_neq => a != b 일시 참
std::is_lt => a < b 일시 참
std::is_lteq => a <= b 일시 참
std::is_gt => a > b 일시 참
std::is_gteq => a >= b 일시 참

 

네, 끝났습니다.

그러면 여기서 마치도록 하겠습니다!

안녕!!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 


728x90

댓글