讨论一下C++比较运算符连写的可行性
  • 板块学术版
  • 楼主__Luna__
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/1/2 16:54
  • 上次更新2023/10/24 05:48:33
查看原帖
讨论一下C++比较运算符连写的可行性
901195
__Luna__楼主2023/1/2 16:54

我们知道,C++的比较运算符,不——能——连——写!

可是,我偏不信这个邪。

我们只需要定义一个类(在此我们称之为比较类),像这样:

#include <iostream>
#include <cmath>
#include <map>
#include <algorithm>
#include<string>
#include<sstream>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
template<typename T>
class Compare
{
    T value;
    bool bl;
public:
    Compare(bool a, const T& b) :bl(a), value(b) {}
    template<typename T1>
    friend Compare<T1> operator >>(const Compare a, T1 b)
    {
        return Compare<T1>(1, b);
    }
    bool operator |(const Compare<void*> a)
    {
        return bl;
    }
    template<typename T1>
    Compare operator >(const T1& a)
    {
        return Compare<T1>(value > a && bl, a);
    }
    template<typename T1>
    Compare operator <(const T1& a)
    {
        return Compare<T1>(value < a&& bl, a);
    }
    template<typename T1>
    Compare operator ==(const T1& a)
    {
        return Compare<T1>(value == a && bl, a);
    }
    template<typename T1>
    Compare operator !=(const T1& a)
    {
        return Compare<T1>(value != a && bl, a);
    }
    template<typename T1>
    Compare operator <=(const T1& a)
    {
        return Compare<T1>(value <= a && bl, a);
    }
    template<typename T1>
    Compare operator >=(const T1& a)
    {
        return Compare<T1>(value >= a && bl, a);
    }
};
const Compare<void*>compare(1, NULL);
#define c_ compare>>
#define _c |compare
int main()
{
    cout << (c_ 1 <= 2 < 3 <= 4 < 5 < 6 <= 6 _c)<<endl; //true(1)
    cout << (c_ 9 > 8 > 7 >= 6 > 5 > 4 >= 4 > 3 _c) << endl; //true(1)
    cout << (c_ 1 < 3 >= 2 _c) << endl; //true(1)
    cout << (c_ 1 == 1 != 3 == 3 _c) << endl; //true(1)
    cout << (c_ 1 <= 2 < 3 == 3 _c) << endl; //true(1)
    //cout << (c_ 1 <= 2 < 3 == 3 <= 4 _c) << endl; //出错,"=="的优先级小于"<"和"<=",计算顺序有误
    cout << ((c_ 1 <= 2 < 3 == 3) <= 4 _c) << endl; //true(1)
    //cout << (c_ 1 <= 2 < 3 != 4 <= 4 _c) << endl; //出错,同上
    cout << ((c_ 1 <= 2 < 3 != 4) <= 4 _c) << endl; //true(1)
    cout << (c_ 1 != 2 == 3 _c) << endl; //false(0)
    cout << (c_ 6 <= 5 < 4 _c) << endl; //false(0)
    return 0;
}

就可以自由地连写C++的比较运算符啦!

注意点:

  • 注意运算符的优先级,重载无法修改优先级

  • 注意“c_ ... _c”标识,将连写的比较运算和普通比较运算区分开

2023/1/2 16:54
加载中...