4.8.1 基本运算概念
由于C++(www.cppentry.com)可重载的操作符很多,因此operators库是由多个类组成的,分别用来实现不同的运算概念,比如less_than_comparable定义了<系列操作符,left_shiftable定义了<<系列操作符。operators中的概念非常多,囊括了C++(www.cppentry.com)中的大部分操作符重载,在这里我们先介绍一些最常用的算术操作符:
equality_comparable:要求提供==,可自动实现!=,相等语义;
less_than_comparable:要求提供<,可自动实现>、<=、>=;
addable:要求提供+=,可自动实现+;
subtractable:要求提供-=,可自动实现-;
incrementable:要求提供前置++,可自动实现后置++;
decrementable:要求提供前置--,可自动实现后置--。
equivalent:要求提供<,可自动实现==,等价语义,它与equality_comparable的区别请参见4.8.5节。
这些概念在库中以同名类的形式提供,用户需要以继承的方式来使用它们。继承的修饰符并不重要(private、public都可以),因为operators库里的类都是空类,没有成员变量和成员函数,仅定义了数个友元操作符函数。
例如,less_than_comparable的形式是:
- template <class T>
- struct less_than_comparable {
- friend bool operator>(const T& x, const T& y);
- friend bool operator<=(const T& x, const T& y);
- friend bool operator>=(const T& x, const T& y);
- };
如果要同时实现多个运算概念则可以使用多重继承技术,把自定义类作为多个概念的子类,但多重继承在使用时存在很多问题,稍后将看到operators库使用了特别的技巧来解决这个问题。