boost::less_than_comparable

12 篇文章 0 订阅

在实际的编程过程中,我们有时候需要对自定义的类重载操作运算符,以便可以进行类之间的比较等操作。

此时,我们可能就需要重载所需的运算符。 但是重载一个类型的操作符时,保证所有操作符都有重载是一件乏味并容易出错的工作,并且确存在这样的事实:其中一些重载的运算符函数可以通过某个或几个的重载运算符函数得出。

举个例子来说:当我们需要重载>、<、>=和<=操作符的时候。如果我们重载了<运算符,那么其实我们通过<就能够确认其他等式。

幸运的是,在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能帮助我们正确的重载大部分的运算符。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值