## 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](http://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`)必须提供:
```
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`)必须提供:
```
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`)必须提供:
```
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`)必须提供:
```
T operator-=(const T&,const T&);
```
返回值的类型必须可以隐式转换为 `T`. 类 `addable` 为 `T` 实现 `T operator-(const T&,const T&)`.
#### orable
`orable` 概念要求类型`T`具有以下语义。
```
T operator|(const T&,const T&);
T operator|=(const T&,const T&);
```
要派生自 `boost::orable`, 派生类(`T`)必须提供:
```
T operator|=(const T&,const T&);
```
返回值的类型必须可以隐式转换为 `T`. 类 `addable` 为 `T` 实现 `T operator|(const T&,const T&)`.
#### andable
`andable` 概念要求类型`T`具有以下语义。
```
T operator&(const T&,const T&);
T operator&=(const T&,const T&);
```
要派生自 `boost::andable`, 派生类(`T`)必须提供:
```
T operator&=(const T&,const T&);
```
返回值的类型必须可以隐式转换为 `T`. 类 `addable` 为 `T` 实现 `T operator&(const T&,const T&)`.
#### incrementable
`incrementable` 概念要求类型`T`具有以下语义。
```
T& operator++(T&);
T operator++(T&,int);
```
要派生自 `boost::incrementable`, 派生类(`T`)必须提供:
```
T& operator++(T&);
```
返回值的类型必须可以隐式转换为 `T`. 类 `addable` 为 `T` 实现 `T operator++(T&,int)`.
#### decrementable
`decrementable` 概念要求类型`T`具有以下语义。
```
T& operator--(T&);
T operator--(T&,int);
```
要派生自 `boost::decrementable`, 派生类(`T`)必须提供:
```
T& operator--(T&);
```
返回值的类型必须可以隐式转换为 `T`. 类 `addable` 为 `T` 实现 `T operator--(T&,int)`.
#### equivalent
`equivalent` 概念要求类型`T`具有以下语义。
```
bool operator<(const T&,const T&);
bool operator==(const T&,const T&);
```
要派生自 `boost::equivalent`, 派生类(`T`)必须提供:
```
bool operator<(const T&,const T&);
```
返回值的类型必须可以隐式转换为 `bool`. 类 `equivalent` 为 `T` 实现 `T operator==(const T&,const T&)`. 注意,等价(equivalence)和相等(equality)准确的说是不一样的;两个等价(equivalent)的对象并不一定是相等的(equal)。但对于这里的 `equivalent` 概念而言,它们是一样的。
### 解引用操作符
对于迭代器,有两个概念特别有用,`dereferenceable` 和 `indexable`, 分别表示了解引用的两种情况:一个是`*t`, `t`是一个支持解引用的迭代器(显然所有迭代器都支持),另一个是indexing, `t[x]`, `t`是一个支持下标操作符寻址的类型,而 `x` 通常是一个整数类型。在更高的抽象级别,它们两个通常一起使用,合称迭代器操作符,包括这两个解引用操作符和一些简单的算术操作符。
#### dereferenceable
`dereferenceable` 概念要求类型`T`具有以下语义,假设 `T` 是操作数,`R` 是引用类型,而 `P` 是指针类型(例如,`T` 是一个迭代器类型,`R` 是该迭代器的`value_type`的引用,而 `P` 则是该迭代器的`value_type`的指针)。
```
P operator->() const;
R operator*() const;
```
要派生自 `boost::dereferenceable`, 派生类(`T`)必须提供:
```
R operator*() const;
```
另外,`R`的一元 `operator&` 必须可以被隐式转换为 `P`. 这意味着 `R` 不必一定要是引用类型,它可以是一个代理类(proxy class)。类`dereferenceable` 为 `T` 实现 `P operator->() const`.
#### indexable
`indexable` 概念要求类型`T`具有以下语义,假设 `T` 是操作数,`R` 是引用类型,`P` 是指针类型,而 `D` 是 `difference_type` (例如,`T` 是一个迭代器类型,`R` 是该迭代器的`value_type`的引用,`P` 是该迭代器的`value_type`的指针,而 `D` 则是 `difference_type`)。
```
R operator[](D) const;
R operator+(const T&,D);
```
要派生自 `boost::indexable`, 派生类(`T`)必须提供:
```
R operator+(const T&,D);
```
类 `indexable` 为 `T` 实现 `R operator[](D) const`.
### 复合算术操作符
到目前为止我们看到的概念都只代表了最简单的功能。但是,还有一些高级的,或是复合的概念,它们由几个简单概念组合而成,或是在复合概念之上再增加简单的概念而成。例如,一个类是 `totally_ordered` 的,如果它同时是 `less_than_comparable` 的和 `equality_comparable`的。这些组合很有用,因为它们减少了代码的数量,同时还表明了重要且常用的概念。由于它们只是表示了已有概念的组合,所以这些概念很容易用一个表格来表示它们所包含的简单概念。例如,如果一个类派生自 `totally_ordered`, 它必须实现 `less_than_comparable` 所要求的操作符(`bool operator<(const T&,const T&)`) 和 `equality_comparable` 所要求的操作符(`bool operator==(const T&,const T&)`)。
| 组合概念 | 由以下概念组成 |
| --- | --- |
| totally_ordered | less_than_comparableequality_comparable |
| additive | addablesubtractable |
| multiplicative | multipliabledividable |
| integer_multiplicative | multiplicativemodable |
| arithmetic | additivemultiplicative |
| integer_arithmetic | additiveinteger_multiplicative |
| bitwise | andableorablexorable |
| unit_steppable | incrementabledecrementable |
| shiftable | left_shiftableright_shiftable |
| ring_operators | additivemultipliable |
| ordered_ring_operators | ring_operatorstotally_ordered |
| field_operators | ring_operatorsdividable |
| ordered_field_operators | field_operatorstotally_ordered |
| euclidian_ring_operators | ring_operatorsdividablemodable |
| ordered_ euclidian_ring_operators | euclidean_ring_operatorstotally_ordered |
- 序
- 前言
- Acknowledgments
- 关于作者
- 本书的组织结构
- Boost的介绍
- 字符串及文本处理
- 数 据结构, 容器, 迭代器, 和算法
- 函数对象及高级编程
- 泛 型编程与模板元编程
- 数学及数字处理
- 输入/输出
- 杂项
- Part I: 通用库
- Library 1. Smart_ptr
- Smart_ptr库如何改进你的程序?
- 何时我们需要智能指针?
- Smart_ptr如何适应标准库?
- scoped_ptr
- scoped_array
- shared_ptr
- shared_array
- intrusive_ptr
- weak_ptr
- Smart_ptr总结
- Library 2. Conversion
- Conversion 库如何改进你的程序?
- polymorphic_cast
- polymorphic_downcast
- numeric_cast
- lexical_cast
- Conversion 总结
- Library 3. Utility
- Utility 库如何改进你的程序?
- BOOST_STATIC_ASSERT
- checked_delete
- noncopyable
- addressof
- enable_if
- Utility 总结
- Library 4. Operators
- Operators库如何改进你的程序?
- Operators
- 用法
- Operators 总结
- Library 5. Regex
- Regex库如何改进你的程序?
- Regex 如何适用于标准库?
- Regex
- 用法
- Regex 总结
- Part II: 容器及数据结构
- Library 6. Any
- Any 库如何改进你的程序?
- Any 如何适用于标准库?
- Any
- 用法
- Any 总结
- Library 7. Variant
- Variant 库如何改进你的程序?
- Variant 如何适用于标准库?
- Variant
- 用法
- Variant 总结
- Library 8. Tuple
- Tuple 库如何改进你的程序?
- Tuple 库如何适用于标准库?
- Tuple
- 用法
- Tuple 总结
- Part III: 函数对象与高级编程
- Library 9. Bind
- Bind 库如何改进你的程序?
- Bind 如何适用于标准库?
- Bind
- 用法
- Bind 总结
- Library 10. Lambda
- Lambda 库如何改进你的程序?
- Lambda 如何适用于标准库?
- Lambda
- 用法
- Lambda 总结
- Library 11. Function
- Function 库如何改进你的程序?
- Function 如何适用于标准库?
- Function
- 用 法
- Function 总结
- Library 12. Signals
- Signals 库如何改进你的程序?
- Signals 如何适用于标准库?
- Signals
- 用法
- Signals 总结