新的
<=>
运算符使编写代码更加方便,如果比较算法不平凡,它可以节省一些性能,因为它不需要重复两次才能获得完整的排序。
或者至少当我了解到这一点时我是这么认为的。 然而,当我尝试在实践中使用它时,在
switch
声明中,它不起作用。
此代码无法编译:
#include <iostream>
void compare_values(int x, int y)
{
switch (x <=> y)
{
case std::strong_ordering::less:
std::cout << "is less\n";
break;
case std::strong_ordering::greater:
std::cout << "is greater\n";
break;
case std::strong_ordering::equal:
std::cout << "is equal\n";
break;
}
}
编译器显示错误,提示
<=>
返回的值不能在 switch
中使用:
<source>: In function 'void compare_values(int, int)':
<source>:5:15: error: switch quantity not an integer
5 | switch (x <=> y)
| ~~^~~~~
Compiler returned: 1
(实例)
我猜想在 switch 中使用 spaceship 操作符是一个非常基本、明显和常见的用例,所以可能有一些技巧可以让它工作。但我无法弄清楚。
如何修复此代码?
太空船运算符返回一个 std::strong_ordering,它不是整型,因此不能在
switch
语句中使用。
您可以在
if-else
语句中使用它。
如果您更喜欢使用
switch
,您可以使用一个简单的实用程序将 std::strong_ordering
转换为具有一些预定义值的整数类型。#include <iostream>
int strong_ordering_to_int(std::strong_ordering o)
{
if (o == std::strong_ordering::less) return -1;
if (o == std::strong_ordering::greater) return 1;
return 0;
}
void compare_vec(int x, int y)
{
switch (strong_ordering_to_int(x <=> y))
{
case -1:
std::cout << "is less\n";
break;
case 1:
std::cout << "is greater\n";
break;
case 0:
std::cout << "is equal\n";
break;
}
}
int main()
{
compare_vec(2, 3);
compare_vec(3, 2);
compare_vec(3, 3);
}
输出:
is less
is greater
is equal