如何正确实现非 POD 类的运算符<=>?



我正在为以下类寻找一种实现三元比较运算符运算符==的方法:

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的实现并不是我想要的。因此,我需要编写自己的实现。

我想要的是:

  1. 我希望相等比较(==!=(基于比较两个操作数(类型为Foo(的成员m_Ym_Xm_C。这三个成员必须是平等的,才能满足平等。m_Vec内容的相等性并不重要(因为以字典方式比较所有这些元素是无效的(
  2. 我希望排序比较(<>(基于比较表达式m_Y*m_X
  3. 我希望排序比较(<=>=(基于比较表达式m_Y*m_X,如果两个操作数在这方面相等,那么两个操作的所有三个成员都应该相等,以满足<=>=(就像在==中一样(

还有,std::strong_orderingstd::weak_ordering哪种比较类别类型更适合这种情况?

我应该如何实现这样的逻辑?这看起来很简单,我在一本关于这个主题的C++20书中读了一整本食谱,但我仍然想不出来。

我相信这是一个偏序,它是一个元素可能不可比的序(<>==都不在它们之间(。您应该验证必要的定律是否成立(如果a < b || a == ba <= b,所有aa <= a,如果a <= b && b <= aaba == b,如果a <= b && b <= cabca <= 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;
}

相关内容

  • 没有找到相关文章

最新更新