#pragma once #include "comparable.h" namespace meta { template inline bool comparable::operator>(const T& rhs) const { static_assert(std::is_same_v() < std::declval()), bool>, "type must be override bool operator<(const T&) const"); return rhs < me(); } template inline bool comparable::operator<=(const T& rhs) const { return !(rhs > me()); } template inline bool comparable::operator>=(const T& rhs) const { return !(me() < rhs); } template inline bool comparable::operator==(const T& rhs) const { return !operator!=(rhs); } template inline bool comparable::operator!=(const T& rhs) const { return me() < rhs || rhs < me(); } template inline T& comparable::me() { return *static_cast(this); } template inline const T& comparable::me() const { return *static_cast(this); } }