在实际的编程过程中,我们有时候需要对自定义的类重载操作运算符,以便可以进行类之间的比较等操作。
此时,我们可能就需要重载所需的运算符。 但是重载一个类型的操作符时,保证所有操作符都有重载是一件乏味并容易出错的工作,并且确存在这样的事实:其中一些重载的运算符函数可以通过某个或几个的重载运算符函数得出。
举个例子来说:当我们需要重载>、<、>=和<=操作符的时候。如果我们重载了<运算符,那么其实我们通过<就能够确认其他等式。
幸运的是,在Boost.Operators中就提供了这种便捷的方法。通过使用Boost.Operators我们能减少不必要的工作量并且能确保其正确性。
boost库中通过把大多数运算符封装到基类中,使用时你只需在自定义类中继承它,并实现所要求的重载操作符,那么我们的自定义类(即派生类)中就有了所需的所有操作符的实现了。
这里我们就以boost::less_than_comparable为例来说明。
下面是boost::less_than_comparable的源码实现:
template <class T, class U, class B = operators_detail::empty_base<T> >
struct less_than_comparable2 : B
{
friend bool operator<=(const T& x, const U& y) { return !static_cast<bool>(x > y); }
friend bool operator>=(const T& x, const U& y) { return !static_cast<bool>(x < y); }
friend bool operator>(const U& x, const T& y) { return y < x; }
friend bool operator<(const U& x, const T& y) { return y > x; }
friend bool operator<=(const U& x, const T& y) { return !static_cast<bool>(y < x); }
friend bool operator>=(const U& x, const T& y) { return !static_cast<bool>(y > x); }
};
template <class T, class B = operators_detail::empty_base<T> >
struct less_than_comparable1 : B
{
friend bool operator>(const T& x, const T& y) { return y < x; }
friend bool operator<=(const T& x, const T& y) { return !static_cast<bool>(y < x); }
friend bool operator>=(const T& x, const T& y) { return !static_cast<bool>(x < y); }
};
上面的less_than_comparable2需要提供>和<,下面的less_than_comparable1只需要提供<即可。
我们来看一个例子:
#ifndef __DISTANCE_H__
#define __DISTANCE_H__
#include <boost/operators.hpp>
class CDistance : public boost::less_than_comparable<CDistance>
{
public:
friend bool operator<(const CDistance &lDistance, const CDistance &rDistance);
CDistance(int iDistance)
:m_iDistance(iDistance)
{
}
~CDistance() { }
private:
int m_iDistance;
};
bool operator<(const CDistance &lDistance, const CDistance &rDistance)
{
return lDistance.m_iDistance < rDistance.m_iDistance;
}
#endif //#ifndef __DISTANCE_H__
#include <iostream>
#include "Distance.h"
using namespace std;
int main(void)
{
CDistance distance1(10);
CDistance distance2(10);
if (distance1 >= distance2)
{
cout << "distance1 >= distance2" << endl;
}
else
{
cout << "distance1 < distance2" << endl;
}
return 0;
}
输出结果如下:
distance1 >= distance2
可以见通过Boost.Operators能帮助我们正确的重载大部分的运算符。