+#define _VARIANT_RELATION_FUNCTION_TEMPLATE(__op, __name) \
+ template<typename... _Types> \
+ constexpr bool operator __op(const variant<_Types...>& __lhs, \
+ const variant<_Types...>& __rhs) \
+ { \
+ return __lhs._M##__name(__rhs, std::index_sequence_for<_Types...>{}); \
+ } \
+\
+ constexpr bool operator __op(monostate, monostate) noexcept \
+ { return 0 __op 0; }
+
+ _VARIANT_RELATION_FUNCTION_TEMPLATE(<, _erased_less_than)
+ _VARIANT_RELATION_FUNCTION_TEMPLATE(<=, _erased_less_equal)
+ _VARIANT_RELATION_FUNCTION_TEMPLATE(==, _erased_equal)
+ _VARIANT_RELATION_FUNCTION_TEMPLATE(!=, _erased_not_equal)
+ _VARIANT_RELATION_FUNCTION_TEMPLATE(>=, _erased_greater_than)
+ _VARIANT_RELATION_FUNCTION_TEMPLATE(>, _erased_greater)