如何使用具有 strcmp 样式函数的 spaceship <=> 运算符?
How to use spaceship <=> operator with strcmp style function?
假设我有一个带有结构 cat
和函数 compare(cat a, cat b)
的 C 库,其中 return 是一个符合以下规则的整数:-
- 如果 a < b 则 returns -1
- 如果 a = b 那么 returns 0
- 如果 a > b 则 returns +1
我正在为这个库编写 C++ 包装器(比如说 catxx
,ct
作为 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 ?*/;
}
我该怎么做?我无法理解排序概念。
- 如果我必须使用自定义
if else
而不是 compare()
怎么办?
- return 类型的运算符<=> 到底是什么?
- 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
.
类型的纯右值
假设我有一个带有结构 cat
和函数 compare(cat a, cat b)
的 C 库,其中 return 是一个符合以下规则的整数:-
- 如果 a < b 则 returns -1
- 如果 a = b 那么 returns 0
- 如果 a > b 则 returns +1
我正在为这个库编写 C++ 包装器(比如说 catxx
,ct
作为 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 ?*/;
}
我该怎么做?我无法理解排序概念。
- 如果我必须使用自定义
if else
而不是compare()
怎么办? - return 类型的运算符<=> 到底是什么?
- weak_ordering、部分排序等是什么意思?
来自 cppreference:
The three-way comparison operator expressions have the form
lhs <=> rhs
The expression returns an object such that
(a <=> b) < 0
iflhs
<rhs
(a <=> b) > 0
iflhs
>rhs
(a <=> b) == 0
iflhs
andrhs
are equal/equivalent.
所以你可以简单地做
auto operator <=> (catxx& a, catxx& b)
{
return compare(a.ct, b.ct) <=> 0;
}
由于操作数是整数类型,运算符产生 std::strong_ordering
.