2

这个问题的轻微变化中。我想使用自定义运算符定义自定义类型,<=>并使用该自定义<=>运算符生成==. 尝试以下

#include <compare>
#include <iostream>
#include <cassert>

struct widget {
  int member;
  int non_comparison_data;
  friend std::strong_ordering operator<=>(const widget& lhs,
                                          const widget& rhs) {
    std::cout << "doing a three way comparison" << std::endl;
    return lhs.member <=> rhs.member;
  }
//   friend bool operator==(const widget& lhs, const widget& rhs) {
//     return 0 == (lhs <=> rhs);
//   }
  friend bool operator==(const widget& lhs, const widget& rhs) = default;
};

int main() {
  widget a{.member = 1, .non_comparison_data = 23};
  widget b{.member = 1, .non_comparison_data = 42};
  assert(a==b);
  return 0;
}

我观察到默认==运算符不使用自定义<=>运算符,而是在没有任何自定义比较的情况下执行并比较所有数据成员。我可以自己定义一个==使用<=>如下的运算符,但我想知道是否有更好的方法来==摆脱<=>.

friend bool operator==(const widget& lhs, const widget& rhs) {{
  return 0 == (lhs <=> rhs);
}

PS:编译器-资源管理器链接

PS:我知道自定义<=>不会生成默认值==,因为==它可能以比使用更优化的方式实现,<=>并且不希望生成低效的默认值。

4

2 回答 2

1

我想知道是否有更好的方法可以让 == 脱离 <=>。

不,没有。您所做的 ( return 0 == (lhs<=>rhs);) 是最佳方式。你还在寻找什么?

于 2020-12-27T21:11:33.787 回答
1

==定义的唯一方法<=>是手动进行。这就是你已经在做的事情。

您可以通过编写成员函数做得更好(非成员friends 的唯一好处是如果您想按值获取。但如果您不这样做,成员函数会更容易 - 只需编写更少的代码) . 然后实现==向前而不是向后......请不要使用尤达条件。

struct widget {
  int member;
  int non_comparison_data;

  std::strong_ordering operator<=>(const widget& rhs) const {
    return member <=> rhs.member;
  }

  bool operator==(const widget& rhs) const {
      return (*this <=> rhs) == 0;
  }
};
于 2020-12-27T21:11:41.563 回答