standard library中已经有了这样的概念:three_way_comparable。 T 满足 three_way_comparable 如果 all 二进制比较运算符和 <=> 都是有效的表达式,<=> 的调用至少给你std::partial_ordering。
这比你提议的要复杂一些——部分是为了避免奇怪的类型(例如,也许某些类型定义了operator<=>,但也出于某种原因删除了operator<=?让我们排除那些......)但是也因为排序需要相等也是非常明智的。仅仅因为一个类型只是部分排序不需要它也不能支持==。
另一点是您的PartialOrder<T&> 实际上最终比较了T 类型的非常量 对象,而不是const 的对象。这并不理想。这就是为什么标准会这样 const remove_reference_t<T>& 跳舞。
请注意,您的建议和标准库概念都不会检查类型是否仅部分排序,而只是检查它是否至少部分排序。 int 满足 std::three_way_comparable 和您的 PartialOrder 概念,尽管显然有一个总订单。
用这个特定概念实现适当包含的一种方法是:
template <typename T>
concept partially_ordered = std::three_way_comparable<T>;
template <typename T>
concept totally_ordered = partially_ordered<T> &&
requires (std::remove_cvref_t<T> const& lhs, std::remove_cvref_t<T> const& rhs) {
{ lhs <=> rhs } -> std::convertible_to<std::weak_ordering>;
};
或者更懒一点:
template <typename T>
concept totally_ordered = partially_ordered<T> &&
std::three_way_comparable<T, std::weak_ordering>;
可能通过将weak_ordering 替换为strong_ordering。
另请注意,有一个std::totally_ordered 概念 - 但它不需要<=>。