如何在switch语句中使用C++太空船运算符(<=>)?
问题:C++太空船运算符结果无法用于switch语句
新的<=>运算符能简化代码编写,若比较逻辑复杂还能提升性能——无需重复两次比较即可完成完整排序。但实际在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; } }
编译器报错信息:
<source>: In function 'void compare_values(int, int)': <source>:5:15: error: switch quantity not an integer 5 | switch (x <=> y) | ~~^~~~~ Compiler returned: 1
修复方案
C++20的<=>运算符返回的是比较类别类型(如std::strong_ordering),这类类型并非整数类型,而switch要求条件表达式必须是整数类型(或可隐式转换为整数的类型),因此直接使用返回值会触发编译错误。以下是两种可行的修复方式:
方式1:将比较结果转换为整数
利用比较类别类型可隐式转换为整数的特性,通过static_cast<int>将结果转为整数后传入switch:
#include <iostream> #include <compare> void compare_values(int x, int y) { switch (static_cast<int>(x <=> y)) { case static_cast<int>(std::strong_ordering::less): std::cout << "is less\n"; break; case static_cast<int>(std::strong_ordering::greater): std::cout << "is greater\n"; break; case static_cast<int>(std::strong_ordering::equal): std::cout << "is equal\n"; break; } }
注:std::strong_ordering的枚举值对应整数:less为-1,greater为1,equal为0,转换后可满足switch的类型要求。
方式2:使用if-else链替代switch
若不想进行类型转换,直接用if-else判断比较结果更符合比较类别类型的设计意图,代码也更直观:
#include <iostream> #include <compare> void compare_values(int x, int y) { auto cmp = x <=> y; if (cmp == std::strong_ordering::less) std::cout << "is less\n"; else if (cmp == std::strong_ordering::greater) std::cout << "is greater\n"; else std::cout << "is equal\n"; }
内容的提问来源于stack exchange,提问作者Piotr Siupa
相关产品推荐
相关产品推荐

