作者 | David Abrahams, Jeremy Siek, Thomas Witt |
---|---|
联系方式 | [email protected], [email protected], [email protected] |
组织 | Boost Consulting, 印第安纳大学 开放系统实验室, Zephyr Associates, Inc. |
版权 | 版权所有 David Abrahams, Jeremy Siek, Thomas Witt 2003. |
摘要 | Boost迭代器库包含两部分。第一部分是一个扩展C++标准迭代器要求的概念系统。第二部分是一个基于这些扩展概念构建迭代器的组件框架,并包含几个有用的迭代器适配器。扩展的迭代器概念经过精心设计,使旧式迭代器可以适应新概念,并且新式迭代器将与旧式算法兼容,尽管如果算法想要充分利用新式迭代器的功能,可能需要更新。该库的几个组件已被C++标准技术报告接受。Boost迭代器库的组件取代了旧的Boost迭代器适配器库。 |
---|
C++98中定义的迭代器类别非常有限,因为它们将两个正交的概念绑定在一起:遍历和元素访问。例如,由于随机访问迭代器在解引用时需要返回一个引用(而不是代理),因此不可能捕获vector<bool>::iterator使用C++98类别的功能。这就是臭名昭著的“vector<bool>不是容器,它的迭代器不是随机访问迭代器”的争论,Herb Sutter为此为标准委员会写了两篇论文(n1185 和 n1211),以及一篇每周大师。新式迭代器不仅仅是修补vector<bool>,还有很多其他已经在使用的迭代器无法用现有的概念充分表示。有关新迭代器概念的详细信息,请参阅我们的
新式迭代器标准提案 (PDF)
编写符合标准的迭代器很棘手,但这种需求经常出现。为了简化新迭代器的实现,Boost.Iterator库提供了iterator_facade类模板,它实现了许多有用的默认值和编译时检查,旨在帮助迭代器作者确保其迭代器正确。
定义一个与某些底层迭代器或类似迭代器的类型相似的新迭代器也很常见,但它会修改底层类型行为的某些方面。为此,该库提供了iterator_adaptor类模板,它专门设计用于尽可能多地利用底层类型的行为。
这两个类的文档可以在以下网页中找到
两者iterator_facade和iterator_adaptor以及下面提到的许多专用适配器都已被提议进行标准化,并被接受到第一个C++技术报告中;有关更多详细信息,请参阅我们的
迭代器外观和适配器标准提案 (PDF)
。
迭代器库提供了一套基于Boost 迭代器外观和适配器的有用的、符合标准的迭代器模板。
如果您一直在使用旧的Boost迭代器适配器库来实现迭代器,您可能编写了一个策略类来捕获迭代器的核心操作。在新库设计中,您将把这些相同的核心操作移动到迭代器类本身的主体中。如果您正在编写一系列迭代器,您可能编写了一个类型生成器来构建iterator_adaptor您需要的特化;在新库设计中,您不需要类型生成器(尽管您可能希望将其保留作为旧代码的兼容性辅助),因为由于使用了奇异递归模板模式 (CRTP) [Cop95],您现在可以自己定义迭代器类并通过继承从iterator_facade或iterator_adaptor获取功能。因此,您还可以更好地控制迭代器的工作方式:您可以添加其他构造函数,甚至可以覆盖库提供的迭代器功能。
如果您正在寻找旧的projection_iterator组件,它的功能已被合并到transform_iterator中:只要函数对象的result_type(或Reference模板参数,如果显式指定)是真正的引用类型,transform_iterator的行为将与projection_iterator以前的版本一样。
在 2000 年,Dave Abrahams 正在为一个指针容器编写迭代器,该迭代器在解引用时会访问指向的元素。作为一名库编写者,他自然而然地决定将这个想法推广,于是 Boost 迭代器适配器库诞生了。Dave 受 Andrei Alexandrescu 一些著作的启发,选择了基于策略的设计(尽管他可能没有很好地理解 Andrei 的想法——所有迭代器的正交属性只有一个策略类)。不久,Jeremy Siek 意识到他需要这个库,他们一起合作制作了一个“Boost 化”的版本,该版本经过审查并被接受到库中。他们撰写了一篇论文并对代码进行了几次重要的修订。
最终,旧库的几个缺点使得重写的需求变得显而易见。Dave 和 Jeremy 于 2002 年在圣克鲁斯 C++ 委员会会议上开始合作,并很快生成了一个可工作的原型。在 Mat Marcus 的敦促下,他们决定使用 GenVoca/CRTP 模式方法,并将策略移到迭代器类本身中。Thomas Witt 表示了兴趣,并成为该项目严格编译时检查的代言人,他添加了 SFINAE 技术的使用,以从重载集中消除错误的转换构造函数和运算符。他还认识到需要一个单独的iterator_facade,并将其从iterator_adaptor中分离出来。最终,在对原型进行了几乎完全的重写之后,他们提出了您今天看到的库。
[Cop95] | [Coplien, 1995] Coplien, J.,奇异递归模板模式,C++ Report,1995 年 2 月,第 24-27 页。 |