作者 | David Abrahams, Jeremy Siek, Thomas Witt |
---|---|
联系方式 | dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com |
组织 | Boost Consulting, Indiana University Open Systems Lab, Zephyr Associates, Inc. |
版权 | Copyright David Abrahams, Jeremy Siek, Thomas Witt 2003。 |
摘要 | Boost Iterator 库包含两部分。第一部分是一套 概念,它扩展了 C++ 标准的迭代器要求。第二部分是构建基于这些扩展概念的迭代器的组件框架,并包含几个有用的迭代器适配器。扩展的迭代器概念经过精心设计,以便旧式迭代器可以适配新概念,并且新式迭代器可以与旧式算法兼容,尽管算法可能需要更新才能充分利用新式迭代器的功能。本库的几个组件已被接受为 C++ 标准技术报告的一部分。Boost Iterator 库的组件取代了旧的 Boost Iterator Adaptor Library。 |
---|
C++98 中定义的迭代器类别非常有限,因为它们将两个独立的 are 概念绑定在一起:遍历和元素访问。例如,由于随机访问迭代器在解引用时必须返回一个引用(而不是代理),因此无法捕获vector<bool>::iterator使用 C++98 类别。这就是关于 Herb Sutter 为标准委员会撰写两篇论文(n1185 和 n1211)以及一篇 Guru of the Week 文章的臭名昭著的“vector<bool>不是容器,其迭代器也不是随机访问迭代器”的困境。新式迭代器远远不止是修补vector<bool>,因为还有许多其他已经使用的迭代器无法被现有概念充分表示。有关新迭代器概念的详细信息,请参阅我们的
新式迭代器标准提案 (PDF)
编写符合标准的迭代器很棘手,但需求却经常出现。为了简化新迭代器的实现,Boost.Iterator 库提供了iterator_facade类模板,它实现了许多有用的默认值和编译时检查,旨在帮助迭代器作者确保其迭代器是正确的。
定义一个与某个底层迭代器或类迭代器类型相似但修改了底层类型行为的某个方面的新迭代器也很常见。为此,该库提供了iterator_adaptor类模板,该模板专门设计用于尽可能地利用底层类型的行为。
有关这两个类的文档可在以下网页找到:
两者iterator_facadeanditerator_adaptor以及下面提到的许多 专用适配器 都已被提议标准化,并被接受为第一个 C++ 技术报告的一部分;请参阅我们的
迭代器外观和适配器标准提案 (PDF)
了解更多详情。
迭代器库基于 Boost 的 迭代器外观和适配器 提供了一套有用的符合标准要求的迭代器模板。
如果您之前使用旧的 Boost Iterator Adaptor 库来实现迭代器,您可能编写了一个策略捕获您的迭代器核心操作的类。在新库设计中,您将这些核心操作移到迭代器类本身的主体中。如果您正在编写一系列迭代器,您可能编写了一个 类型生成器 来构建您需要的iterator_adaptor特化;在新库设计中,您不需要类型生成器(尽管可以保留它作为旧代码的兼容性辅助),因为由于使用了奇异递归模板模式(CRTP)[Cop95],您现在可以自己定义迭代器类,并通过继承从iterator_facade或iterator_adaptor获得功能。因此,您还可以更精细地控制迭代器的工作方式:您可以添加额外的构造函数,甚至可以覆盖库提供的迭代器功能。
如果您正在寻找旧的projection_iterator组件,其功能已合并到transform_iterator中:只要函数对象的result_type(或显式指定的参考模板参数)是真正的引用类型,transform_iterator将表现得像projection_iterator以前一样。
2000 年,Dave Abrahams 在编写一个用于指针容器的迭代器,该迭代器在解引用时会访问被指向的元素。自然地,作为库的作者,他决定将这个想法泛化,Boost Iterator Adaptor 库由此诞生。Dave 从 Andrei Alexandrescu 的一些著作中获得灵感,并选择了一种基于策略的设计(尽管他可能没有很好地捕捉到 Andrei 的想法——所有迭代器的正交属性只有一个策略类)。很快,Jeremy Siek 意识到他需要这个库,他们合作制作了一个“Boostified”版本,该版本经过审查并被库接受。他们写了一篇论文,并对代码进行了几项重要修改。
最终,旧库的几个缺点开始显现出重写的必要性。Dave 和 Jeremy 在 2002 年的 Santa Cruz C++ 委员会会议上开始合作,并迅速生成了一个可用的原型。在 Mat Marcus 的敦促下,他们决定采用 GenVoca/CRTP 模式方法,并将策略移到迭代器类本身。Thomas Witt 表示了兴趣,并成为该项目严格编译时检查的声音,添加了 SFINAE 技术的使用,以消除重载集中的假转换构造函数和运算符。他还认识到一个独立的iterator_facade的必要性,并将其从iterator_adaptor中分离出来。最后,在对原型进行近乎完整的重写之后,他们得到了今天的库。
[Cop95] | [Coplien, 1995] Coplien, J., Curiously Recurring Template Patterns, C++ Report, February 1995, pp. 24-27。 |