宇宙飞船操作员的真实世界使用示例
Real world usage example for spaceship operator
宇宙飞船运算符的定义是为了对顺序进行严格定义,但这会影响您的 客户端代码 的编写方式还是如何定义您的 class 比较运算符?
因为在其他 post 中缺少真实世界的示例,所以我没有完全理解这部分。
关于宇宙飞船操作员的其他post:
<=>
让懒惰的方式也成为高效的方式。您不要更改 您的客户端代码。
当存在 using std::rel_ops
(或 boost::ordered
等)时,客户端可能会看到性能优势。
一个例子
// old and busted
struct Person : boost::totally_ordered<Person>
{
std::string firstname;
std::string lastname
bool operator<(const Person & other)
{
return std::tie(firstname, lastname)
< std::tie(other.firstname, other.lastname);
}
}
// new hotness
struct Person
{
std::string firstname;
std::string lastname;
auto operator<=>(const Person &) = default;
}
int main()
{
Person person1 { "John", "Smith" };
Person person2 { "John", "Smith" };
std::cout << person2 <= person1 << std::endl;
}
你只是比较一下你一直以来的做法:
a < b
只是在幕后,该表达式的候选函数之一也会找到 (a <=> b) < 0
,如果该候选函数存在并且恰好是最可行的候选函数,则会调用它。
您通常不会在 "client code" 中直接使用 <=>
,您只需直接使用您想要的比较。
例如,给定:
struct X {
int i;
// this can be = default, just writing it out for clarity
strong_ordering operator<=>(X const& rhs) const { return i <=> rhs.i; }
};
表达式
X{42} < X{57};
将评估为 X{42} <=> X{57} < 0
(没有 <
候选,因此 <=>
非反向是最好的候选)。 X{42} <=> X{57}
的计算结果为 42 <=> 57
,即 strong_ordering::less
。还有那个 < 0
returns true
。因此,初始表达式是 true
... 正如预期的那样。
同样的运算符也直接给了我们那个X{57} > X{42}
,那个X{3} >= X{2}
,等等
<=>
的优点是只需要写一个运算符而不是四个,该运算符通常比<
更容易写,可以正确表达部分和部分的区别订单总数,并将其堆叠通常性能更高(例如,在 string
的情况下)。
此外,我们不必生活在每个人都假装 operator<
是唯一存在的关系运算符的怪异世界中。
宇宙飞船运算符的定义是为了对顺序进行严格定义,但这会影响您的 客户端代码 的编写方式还是如何定义您的 class 比较运算符?
因为在其他 post 中缺少真实世界的示例,所以我没有完全理解这部分。
关于宇宙飞船操作员的其他post:
<=>
让懒惰的方式也成为高效的方式。您不要更改 您的客户端代码。
当存在 using std::rel_ops
(或 boost::ordered
等)时,客户端可能会看到性能优势。
一个例子
// old and busted
struct Person : boost::totally_ordered<Person>
{
std::string firstname;
std::string lastname
bool operator<(const Person & other)
{
return std::tie(firstname, lastname)
< std::tie(other.firstname, other.lastname);
}
}
// new hotness
struct Person
{
std::string firstname;
std::string lastname;
auto operator<=>(const Person &) = default;
}
int main()
{
Person person1 { "John", "Smith" };
Person person2 { "John", "Smith" };
std::cout << person2 <= person1 << std::endl;
}
你只是比较一下你一直以来的做法:
a < b
只是在幕后,该表达式的候选函数之一也会找到 (a <=> b) < 0
,如果该候选函数存在并且恰好是最可行的候选函数,则会调用它。
您通常不会在 "client code" 中直接使用 <=>
,您只需直接使用您想要的比较。
例如,给定:
struct X {
int i;
// this can be = default, just writing it out for clarity
strong_ordering operator<=>(X const& rhs) const { return i <=> rhs.i; }
};
表达式
X{42} < X{57};
将评估为 X{42} <=> X{57} < 0
(没有 <
候选,因此 <=>
非反向是最好的候选)。 X{42} <=> X{57}
的计算结果为 42 <=> 57
,即 strong_ordering::less
。还有那个 < 0
returns true
。因此,初始表达式是 true
... 正如预期的那样。
同样的运算符也直接给了我们那个X{57} > X{42}
,那个X{3} >= X{2}
,等等
<=>
的优点是只需要写一个运算符而不是四个,该运算符通常比<
更容易写,可以正确表达部分和部分的区别订单总数,并将其堆叠通常性能更高(例如,在 string
的情况下)。
此外,我们不必生活在每个人都假装 operator<
是唯一存在的关系运算符的怪异世界中。