如何在 switch 语句中使用 spaceship 运算符

问题描述 投票:0回答:1

新的

<=>
运算符使编写代码更加方便,如果比较算法不平凡,它可以节省一些性能,因为它不需要重复两次才能获得完整的排序。

或者至少当我了解到这一点时我是这么认为的。 然而,当我尝试在实践中使用它时,在

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 操作符是一个非常基本、明显和常见的用例,所以可能有一些技巧可以让它工作。但我无法弄清楚。

如何修复此代码?

c++ switch-statement c++20 spaceship-operator
1个回答
0
投票

太空船运算符返回一个 std::strong_ordering,它不是整型,因此不能在

switch
语句中使用。

您可以在

if-else
语句中使用它。

如果您更喜欢使用

switch
,您可以使用一个简单的实用程序将
std::strong_ordering
转换为具有一些预定义值的整数类型。
在这种情况下返回 -1/0/1 是很自然的:

#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
© www.soinside.com 2019 - 2024. All rights reserved.