【现代C++】三路比较运算符

在这里插入图片描述

C++20引入了三路比较运算符(也称为太空船运算符,<=>),它允许同时比较两个值,并返回它们的相对顺序。这个运算符简化了需要定义多个比较运算符(如==!=<<=>>=)的类的代码,提高了代码的简洁性和可读性。以下是三路比较运算符的详细介绍和示例代码:

1. 基本用法

三路比较运算符返回一个std::strong_orderingstd::weak_orderingstd::partial_ordering类型的值,表示小于、等于或大于。

#include <compare>
#include <iostream>

void basicUsage() {
    int a = 5, b = 10;
    auto result = a <=> b;

    if (result < 0) {
        std::cout << "a < b" << std::endl;
    } else if (result == 0) {
        std::cout << "a == b" << std::endl;
    } else {
        std::cout << "a > b" << std::endl;
    }
}

2. 在类中使用

你可以在自定义类型中重载三路比较运算符来提供全面的比较功能。

#include <compare>
#include <iostream>

class Point {
public:
    int x, y;

    auto operator<=>(const Point&) const = default;  // 默认比较生成
};

void classUsage() {
    Point p1{1, 2}, p2{1, 3};

    if (p1 <=> p2 == 0) {
        std::cout << "p1 == p2" << std::endl;
    } else {
        std::cout << "p1 != p2" << std::endl;
    }
}

3. 自定义比较逻辑

当默认生成的比较逻辑不符合需求时,你可以为三路比较运算符提供自定义实现。

#include <compare>
#include <iostream>

class Distance {
public:
    int meters;

    std::strong_ordering operator<=>(const Distance& other) const {
        return meters <=> other.meters;
    }
};

void customComparison() {
    Distance d1{100}, d2{200};

    if (d1 <=> d2 < 0) {
        std::cout << "d1 < d2" << std::endl;
    } else if (d1 <=> d2 == 0) {
        std::cout << "d1 == d2" << std::endl;
    } else {
        std::cout << "d1 > d2" << std::endl;
    }
}

4. 使用结果进行链式比较

三路比较运算符的结果可以用于链式比较,提高代码的可读性和编写效率。

#include <compare>
#include <iostream>

void chainComparison() {
    int a = 5, b = 5, c = 10;
    
    if (auto result = a <=> b; result == 0) {
        std::cout << "a == b, ";
        std::cout << "and they are " << ((a <=> c) < 0 ? "less" : "greater") << " than c" << std::endl;
    }
}

通过上述示例可以看到三路比较运算符如何在现代C++中被用于简化比较逻辑,使得代码更加简洁且易于理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值