// operators.cpp : 定义控制台应用程序的入口点。
//made by davidsu33
//2014-6-8 18:40
#include "stdafx.h"
#include <utility>
#include <cassert>
#include <boost/operators.hpp>
using namespace std;
//utility中提供的rel_ops,操作符之间的转换
//通过实现<和==操作来完成> ! >= <=的操作
struct Point
{
int x,y;
};
bool operator==(const Point& l, const Point& r)
{
return (l.x==r.x) && (l.y==r.y);
}
bool operator<(const Point& l, const Point& r)
{
if (l.x != r.x)
{
return l.x < r.x;
}
return l.y < r.y;
}
void use_rel_ops()
{
//上述对于Point的操作仅实现了==操作符和<操作符
using namespace std::rel_ops;//****必须要加上该命名空间,否则编译不过
Point p1, p2;
p1.x = 2, p1.y = 3, p2.x=2, p2.y=3;
assert(p1 >= p2);
assert(p1 <= p2);
p1.x = 4;
assert(p1 > p2);
assert(p1 != p2);
p1.x = p2.x;
assert(p1 == p2);
}
template<class T>
class Point2D : public boost::less_than_comparable1<Point2D<T>, boost::addable<Point2D<T>>>
{
public:
bool operator<(const Point2D<T>& r) const;
Point2D<T>& operator+=(const Point2D<T>& r);
T length() const;
void setX(const T& rx){x = rx;}
void setY(const T& ry){y = ry;}
T getX() const {return x;}
T getY() const {return y;}
private:
T x,y;
};
template<class T>
Point2D<T>& Point2D<T>::operator+=( const Point2D<T>& r )
{
x += r.x;
y += r.y;
return (*this);
}
template<class T>
T Point2D<T>::length() const
{
return (x*x+y*y);
}
template<class T>
bool Point2D<T>::operator<( const Point2D<T>& r ) const
{
return length() < r.length();
}
int _tmain(int argc, _TCHAR* argv[])
{
use_rel_ops();
Point2D<double> d1, d2, d3;
d1.setX(10);
d1.setY(10);
assert(d2 > d1);
assert(d2 >= d1);
assert(d1 <= d2);
d2.setX(20), d2.setY(20);
d3 = d1 + d2;
d3 += d3;
assert(d3.getX() == 60 && d3.getY() == 60);
return 0;
}
//made by davidsu33
//2014-6-8 18:40
#include "stdafx.h"
#include <utility>
#include <cassert>
#include <boost/operators.hpp>
using namespace std;
//utility中提供的rel_ops,操作符之间的转换
//通过实现<和==操作来完成> ! >= <=的操作
struct Point
{
int x,y;
};
bool operator==(const Point& l, const Point& r)
{
return (l.x==r.x) && (l.y==r.y);
}
bool operator<(const Point& l, const Point& r)
{
if (l.x != r.x)
{
return l.x < r.x;
}
return l.y < r.y;
}
void use_rel_ops()
{
//上述对于Point的操作仅实现了==操作符和<操作符
using namespace std::rel_ops;//****必须要加上该命名空间,否则编译不过
Point p1, p2;
p1.x = 2, p1.y = 3, p2.x=2, p2.y=3;
assert(p1 >= p2);
assert(p1 <= p2);
p1.x = 4;
assert(p1 > p2);
assert(p1 != p2);
p1.x = p2.x;
assert(p1 == p2);
}
template<class T>
class Point2D : public boost::less_than_comparable1<Point2D<T>, boost::addable<Point2D<T>>>
{
public:
bool operator<(const Point2D<T>& r) const;
Point2D<T>& operator+=(const Point2D<T>& r);
T length() const;
void setX(const T& rx){x = rx;}
void setY(const T& ry){y = ry;}
T getX() const {return x;}
T getY() const {return y;}
private:
T x,y;
};
template<class T>
Point2D<T>& Point2D<T>::operator+=( const Point2D<T>& r )
{
x += r.x;
y += r.y;
return (*this);
}
template<class T>
T Point2D<T>::length() const
{
return (x*x+y*y);
}
template<class T>
bool Point2D<T>::operator<( const Point2D<T>& r ) const
{
return length() < r.length();
}
int _tmain(int argc, _TCHAR* argv[])
{
use_rel_ops();
Point2D<double> d1, d2, d3;
d1.setX(10);
d1.setY(10);
assert(d2 > d1);
assert(d2 >= d1);
assert(d1 <= d2);
d2.setX(20), d2.setY(20);
d3 = d1 + d2;
d3 += d3;
assert(d3.getX() == 60 && d3.getY() == 60);
return 0;
}