C++“准”标准库Boost学习指南(4):Boost.Operators

本文介绍了Boost.Operators库在C++中的应用,它简化了为自定义类型添加比较和算术操作符的过程。通过派生自如`boost::less_than_comparable`和`boost::addable`等基类,可以确保操作符的正确性和对称性。文章通过示例解释了如何使用该库,并强调了在决定添加操作符时应慎重考虑其必要性。
摘要由CSDN通过智能技术生成
Boost.Operators  

Operators库提供了相关操作符及概念(LessThanComparable, Arithmetic,等等)的实现。定义一个类型的操作符时,保证所有操作符都有定义是一件乏味并容易出错的工作。例如,你提供了operator< (LessThanComparable),通常都要同时提供operator<=, operator>, 和 operator>= 。Operators可以根据给定类型的最小的用户自定义操作符集合,自动声明并定义其它所有的相关操作符。

Operators库如何改进你的程序?
  • 提供一组完整的比较操作符
  • 提供一组完整的算术操作符
  • 提供一组完整的迭代器操作符

C++定义的操作符可以分成几组。当你在一个类中碰到某组操作符中的一个,通常你还会碰到同组中的其它操作符。例如,如果一个类提供了 operator==, 你通常还会看到 operator!= ,或许还有 operator<, operator<=, operator>, 和 operator>=. 有时,一个类仅提供了 operator< 以定义一个次序,这个类的对象就可以用于关联容器,但通常忘了类的使用者想要更多的操作符。同样地,一个具有值语义的类可以只提供了 operator+ 而没有 operator+= 或 operator- 会限制它的使用。当你为你的类定义了一组操作符中的一个时,你应该也提供该组中其余的操作符,以避免令人惊讶。不幸的是,为一个类增加多个操作符以支持比较或算术运算是很麻烦并且容易出错的,还有,迭代器类必须根据它所依照的迭代器种类来提供一组特定的操作符以确保其功能正确。

定义多个所需的操作符除了沉闷以外,还必须确保它们的语义符合用户的期望。否则,这个类将没有任何实际的用途。但我们可以无须全部依靠手工来实现它们。如你所知,某些操作符是根据其它操作符实现的,如 operator+ 就可以参照 operator+=实现,这意味着可以自动实现部分工作。事实上,这正是Boost.Operators的目的。它允许你只定义所需的比较或算术操作符的一个子集,然后基于你提供的操作符自动定义其它的操作符,Boost.Operators保证了正确的操作符语义,并减少了你犯错的机会。

Operators库的另一个好处在于为不同操作符给出了明确的概念命名,例如支持operator+ 和 operator+=的类称为addable,支持operator<< 和 operator>>的类称为shiftable,等等。这很重要,有两个原因:一个统一的命名方法更为易懂;而且这些概念以及其后命名的类,可以是类接口的一部分,清晰地表明了重要的行为。

Operators如何配合标准库?

在使用标准库容器和算法时,通常至少要支持一些关系操作符(最常见的是 operator<) 以提供排序,从而可以在关联容器中按顺序存储对象。常见的惯例是仅定义所需操作符的最小集合,其副作用是类的定义不够完整,也更难理解。另一方面,如果定义全部完整的操作符,就会有语义错误的风险。这种情况下,Operators库帮助我们确保类的行为是正确的,并同时满足标准库和用户的要求。最后,对于定义了算术操作符的类型,也有一些操作符是依照其它操作符而实现的,所以Boost.Operators在这里也很有帮助。

Operators

头文件: "boost/operators.hpp"

Operators库由多个基类组成。每一个类生成与其名字概念相关的操作符。你可以用继承的方式来使用它们,如果你需要一个以上的功能,则需要使用多重继承。幸运的是,Operators中定义了一些复合的概念,在大多数情况下可以无须使用多重继承。下面将介绍最常用的一些Operator类,包括它们所表示的概念,以及它们对派生类的要求。某些情况下,使用Operators时,对真实概念的要求会不同于对该概念基类的要求。例如,概念 addable 要求有一个操作符 T operator+(const T& lhs,const T& rhs) 的定义,而Operators的基类 addable 却要求有一个成员函数,T operator+=(const T& other). 使用这个成员函数,基类 addable 为派生类自动增加了 operator+. 在以下章节中,都是首先给出概念,然后再给出对派生自该概念的类的要求。我没有重复本库中的所有概念,仅是挑选了最重要的一些;你可以在 www.boost.org 上找到完整的参考文档。

less_than_comparable

less_than_comparable 要求类型T具有以下语义。

bool operator<(const T&,const T&); 
bool operator>(const T&,const T&); 
bool operator<=(const T&,const T&);
bool operator>=(const T&,const T&);


要派生自 boost::less_than_comparable, 派生类(T)必须提供:
  1. bool operator<(const T&, const T&);
注意,返回值的类型不必是真正的 bool, 但必须可以隐式转换为 bool. C++标准中的概念 LessThanComparable 要求提供operator< ,所以从 less_than_comparable 派生的类必须符合该要求。作为回报,less_than_comparable 将依照 operator< 实现其余的三个操作符。

equality_comparable

equality_comparable 要求类型T具有以下语义。

bool operator==(const T&,const T&);
bool operator!=(const T&,const T&);


要派生自 boost::equality_comparable, 派生类(T)必须提供:
  1. bool operator==(const T&,const T&);
同样,返回值的类型不必是 bool, 但必须可以隐式转换为 bool. C++标准中的概念 EqualityComparable 要求必须提供 operator== ,因此从 equality_comparable 派生的类必须符合该要求。equality_comparable 类为 T 提供 bool operator!=(const T&,const T&).

addable

addable 概念要求类型T具有以下语义。

T operator+(const T&,const T&);
T operator+=(const T&);


要派生自 boost::addable, 派生类(T)必须提供:
  1. T operator+=(const T&);
返回值的类型必须可以隐式转换为 T. 类 addable 为 T 实现 T operator+(const T&,const T&).

subtractable

subtractable 概念要求类型T具有以下语义。

T operator-(const T&,const T&);
T operator-=(const T&);  // 译注:原文为 T operator+=(const T&); 有误


要派生自 boost::subtractable, 派生类(T)必须提供:
  1. T operator-=(const T&,const T&);
返回值的类型必须可以隐式转换为 T. 类 addable 为 T 实现 T operator-(const T&,const T&).

orable

orable 概念要求类型T具有以下语义。
  1. T operator|(const T&,const T&);
  2. T operator|=(const T&,const T&);
要派生自 boost::orable, 派生类(T)必须提供:
  1. T operator|=(const T&,const T&);
返回值的类型必须可以隐式转换为 T. 类 addable 为 T 实现 T operator|(const T&,const T&).

andable

andable 概念要求类型T具有以下语义。
  1. T operator&(const T&,const T&);
  2. T operator&=(const T&,const T&);
要派生自 boost::andable, 派生类(T)必须提供:
  1. T operator&=(const T&,const T&);
返回值的类型必须可以隐式转换为 T. 类 addable 为 T 实现 T operator&(const T&,const T&).

incrementable

incrementable 概念要求类型T具有以下语义。
  1. T& operator++(T&);
  2. T operator++(T&,int);
要派生自 boost::incrementable, 派生类(T)必须提供:
  1. T& operator++(T&);
返回值的类型必须可以隐式转换为 T. 类 addable 为 T 实现 T operator++(T&,int).

decrementable

decrementable 概念要求类型T具有以下语义。
  1. T& operator--(T&);
  2. T operator--(T&,int);
要派生自 boost::decrementable, 派生类(T)必须提供:
  1. T& operator--(T&);
返回值的类型必须可以隐式转换为 T. 类 addable 为 T 实现 T operator--(T&,int).

equivalent

equivalent 概念要求类型T具有以下语义。
  1. bool operator<(const T&,const T&);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值