我们知道,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”标识,将连写的比较运算和普通比较运算区分开