如何使用具有 strcmp 样式函数的 spaceship <=> 运算符?

How to use spaceship <=> operator with strcmp style function?

假设我有一个带有结构 cat 和函数 compare(cat a, cat b) 的 C 库,其中 return 是一个符合以下规则的整数:-

我正在为这个库编写 C++ 包装器(比如说 catxxct 作为 C 结构成员)并且想使用新的 C++20 宇宙飞船运算符。

bool operator == (catxx& a, catxx& b)
{
    return !compare(a.ct, b.ct);
}

auto operator <=> (catxx& a, catxx& b)
{
    int result = compare(a.ct, b.ct);
    return /*what ?*/;
}

我该怎么做?我无法理解排序概念。

  1. 如果我必须使用自定义 if else 而不是 compare() 怎么办?
  2. return 类型的运算符<=> 到底是什么?
  3. weak_ordering、部分排序等是什么意思?

来自 cppreference:

The three-way comparison operator expressions have the form

lhs <=> rhs

The expression returns an object such that

  • (a <=> b) < 0 if lhs < rhs
  • (a <=> b) > 0 if lhs > rhs
  • (a <=> b) == 0 if lhs and rhs are equal/equivalent.

所以你可以简单地做

auto operator <=> (catxx& a, catxx& b)
{
  return compare(a.ct, b.ct) <=> 0;
}

由于操作数是整数类型,运算符产生 std::strong_ordering.

类型的纯右值