这就是特性测试宏的用途。有一个
standing document
三方比较
明确地
有点棘手,因为这是一个需要语言和库支持的功能。有一个语言级的feature test宏,但它不是为您(用户)设计的,它是为了让标准库的作者有条件地提供该功能。
#if __has_include(<compare>)
# include <compare>
# if defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907
# define SPACESHIP_OPERATOR_IS_SUPPORTED 1
# endif
#endif
现在在剩下的代码中,您可以检查
#ifdef SPACESHIP_OPERATOR_IS_SUPPORTED
<=>
:
#ifdef SPACESHIP_OPERATOR_IS_SUPPORTED
bool operator==(const thing<N> &) const = default;
std::strong_ordering operator<=>(const thing<N> &) const = default;
template <int R> bool operator==(const thing<R> &) const = delete;
template <int R> std::strong_ordering operator<=>(const thing<R> &) const = delete;
#else
bool operator==(const thing<N> &) const { return true; }
bool operator!=(const thing<N> &) const { return false; }
bool operator< (const thing<N> &) const { return false; }
bool operator> (const thing<N> &) const { return false; }
bool operator<=(const thing<N> &) const { return true; }
bool operator>=(const thing<N> &) const { return true; }
template <int R> bool operator==(const thing<R> &) const = delete;
template <int R> bool operator!=(const thing<R> &) const = delete;
template <int R> bool operator< (const thing<R> &) const = delete;
template <int R> bool operator> (const thing<R> &) const = delete;
template <int R> bool operator<=(const thing<R> &) const = delete;
template <int R> bool operator>=(const thing<R> &) const = delete;
#endif
你不需要提供
违约
<=>
和
所有关系运算符。所以我们
<
:这样你就可以写作了
<
它本身。你还需要提供
operator==
但只是因为你需要做一些特别的事
delete
<=>