C++20中是否存在对应三路比较运算符<=>的std::less等价物?
C++20中适配三路比较运算符
<=>的工具 C++20确实提供了适配三路比较运算符<=>的标准工具——std::compare_three_way,它定义在<compare>头文件中。这个函数对象会直接调用参数的三路比较运算符,返回对应的比较类别类型(如std::strong_ordering、std::weak_ordering或std::partial_ordering),而非像std::less那样返回布尔值。
如果你想定义一个支持自定义比较器的数据结构,类似std::map或std::unordered_map的模板参数设计,可以将std::compare_three_way作为默认比较器。示例代码如下:
#include <compare> template <typename Key, typename Value, typename Compare = std::compare_three_way> struct MyContainer { // 使用默认或自定义比较器进行键的三路比较 auto compare_keys(const Key& lhs, const Key& rhs) const { return Compare{}(lhs, rhs); } // 基于三路比较结果实现判断逻辑(比如判断lhs是否小于rhs) bool is_less(const Key& lhs, const Key& rhs) const { return compare_keys(lhs, rhs) < 0; } // 容器的其他成员实现... };
需要注意的是:
std::compare_three_way要求Key类型必须支持三路比较运算符<=>,否则会触发编译错误。- 如果你的容器只需要严格弱序的布尔比较(类似
std::map的需求),std::less在C++20中仍然可用——当Key类型定义了<=>时,编译器会自动合成对应的operator<,std::less会间接利用三路比较实现逻辑。
内容的提问来源于stack exchange,提问作者Dewfy
相关产品推荐
相关产品推荐

