我正在为以下类寻找一种实现三元比较运算符和运算符==的方法:
class Foo
{
public:
auto operator<=>( const Foo& rhs ) const noexcept = default;
private:
std::uint32_t m_Y;
std::uint32_t m_X;
char m_C;
std::vector<char> m_Vec;
};
但是default
的实现并不是我想要的。因此,我需要编写自己的实现。
我想要的是:
- 我希望相等比较(
==
和!=
(基于比较两个操作数(类型为Foo
(的成员m_Y
、m_X
和m_C
。这三个成员必须是平等的,才能满足平等。m_Vec
内容的相等性并不重要(因为以字典方式比较所有这些元素是无效的( - 我希望排序比较(
<
和>
(基于比较表达式m_Y
*m_X
- 我希望排序比较(
<=
和>=
(基于比较表达式m_Y
*m_X
,如果两个操作数在这方面相等,那么两个操作的所有三个成员都应该相等,以满足<=
或>=
(就像在==
中一样(
还有,std::strong_ordering
和std::weak_ordering
哪种比较类别类型更适合这种情况?
我应该如何实现这样的逻辑?这看起来很简单,我在一本关于这个主题的C++20书中读了一整本食谱,但我仍然想不出来。
我相信这是一个偏序,它是一个元素可能不可比的序(<
、>
或==
都不在它们之间(。您应该验证必要的定律是否成立(如果a < b || a == b
为a <= b
,所有a
为a <= a
,如果a <= b && b <= a
为a
,b
为a == b
,如果a <= b && b <= c
为a
,b
,c
为a <= c
(。如果是这种情况,请使用std::partial_ordering
。
std::partial_ordering operator<=>(Foo const &other) const noexcept {
// compare your * expression first
std::partial_ordering ret = (this->m_Y * this->m_X) <=> (other.m_Y * other.m_X);
if(ret != 0) return ret;
// if that's not informative, compare the fields
return std::tie(this->m_Y, this->m_X, this->m_C) == std::tie(other.m_Y, other.m_X, other.m_C)
? std::partial_ordering::equivalent : std::partial_ordering::unordered;
}