如何使用三向比较(飞船op)实现不同类型之间的operator==?
How to use three-way comparison (spaceship op) to implement operator== between different types?
简单任务:我有这两种类型
struct type_a{
int member;
};
struct type_b{
int member;
};
我想用这个新的C++20 ship op,人人都说酷到可以写type_a{} == type_b{}
。我没能做到。即使我在它们之间写operator<=>
,我也只能调用type_a{} <=> type_b{}
,而不能进行简单的比较。这让我感到困惑,就像单个 class,三向比较也定义了所有其他的。
替代方案?如何使 std::three_way_comparable_with<type_a, type_b>
为真?
题目前提错误。你不使用三向比较运算符(<=>
)来实现==
:你使用==
来实现==
:
bool operator==(type_a a, type_b b) {
return a.member == b.member;
}
混淆的根源在于这条规则有一个例外:如果一个类型声明了一个 defaulted <=>
那么它 also 声明一个 默认 ==
:
struct type_c {
int member;
auto operator<=>(type_c const&) const = default;
};
该声明相当于写了:
struct type_c {
int member;
bool operator==(type_c const&) const = default;
auto operator<=>(type_c const&) const = default;
};
但是给你 ==
的不是 <=>
:它仍然是 ==
,而且只有 ==
给你 ==
。
我建议将一种类型转换为另一种类型:
struct type_a{
int member;
friend auto operator<=>(const type_a&, const type_a&) = default;
};
struct type_b{
int member;
operator type_a() {
return {member};
}
};
这也是 operator<=> 之前的解决方案,但现在定义通用类型的比较更简单。
简单任务:我有这两种类型
struct type_a{
int member;
};
struct type_b{
int member;
};
我想用这个新的C++20 ship op,人人都说酷到可以写type_a{} == type_b{}
。我没能做到。即使我在它们之间写operator<=>
,我也只能调用type_a{} <=> type_b{}
,而不能进行简单的比较。这让我感到困惑,就像单个 class,三向比较也定义了所有其他的。
替代方案?如何使 std::three_way_comparable_with<type_a, type_b>
为真?
题目前提错误。你不使用三向比较运算符(<=>
)来实现==
:你使用==
来实现==
:
bool operator==(type_a a, type_b b) {
return a.member == b.member;
}
混淆的根源在于这条规则有一个例外:如果一个类型声明了一个 defaulted <=>
那么它 also 声明一个 默认 ==
:
struct type_c {
int member;
auto operator<=>(type_c const&) const = default;
};
该声明相当于写了:
struct type_c {
int member;
bool operator==(type_c const&) const = default;
auto operator<=>(type_c const&) const = default;
};
但是给你 ==
的不是 <=>
:它仍然是 ==
,而且只有 ==
给你 ==
。
我建议将一种类型转换为另一种类型:
struct type_a{
int member;
friend auto operator<=>(const type_a&, const type_a&) = default;
};
struct type_b{
int member;
operator type_a() {
return {member};
}
};
这也是 operator<=> 之前的解决方案,但现在定义通用类型的比较更简单。