如何将 spaceship <=> 运算符与 strcmp 样式函数一起使用?

Tan*_*yal 5 c++ spaceship-operator c++20

假设我有一个带有 struct 的 C 库cat,以及一个compare(cat a, cat b)根据以下规则返回整数的函数:-

  • 如果 a < b 则返回 -1
  • 如果 a = b 则返回 0
  • 如果 a > b 则返回 +1

我正在为此库编写 C++ 包装器(例如catxx,使用ctC 结构成员),并希望使用新的 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 ?*/;
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做?我无法理解订购概念。

  1. 如果我必须使用 customif else而不是怎么办compare()
  2. 运算符 <=> 的返回类型到底是什么?
  3. 弱排序、偏排序等是什么意思?

康桓瑋*_*康桓瑋 8

来自cppreference

三路比较运算符表达式的形式为

lhs <=> rhs
Run Code Online (Sandbox Code Playgroud)

该表达式返回一个对象,使得

  • (a <=> b) < 0如果lhs<rhs
  • (a <=> b) > 0如果lhs>rhs
  • (a <=> b) == 0如果lhsrhs相等/等效。

所以你可以简单地做

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

由于操作数是整型,因此该运算符生成 类型的纯右值std::strong_ordering

  • OP不是已经实现了“operator==”吗? (2认同)