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在这里也很有帮助。