常规迭代器(或类似的范围/视图类)是否应该来自const_iterator?

时间:2015-03-02 21:20:38

标签: c++ design-patterns iterator const-iterator

使常规迭代器(或类似范围或视图类)派生自相应的const_iterator是一种好习惯吗?

动机就是

  • 分享代码,
  • 当迭代器/视图很大时,避免转换。

例如,考虑一个3D网格的视图,网格的一部分。它可以包含1个指针,3个大小和2-3个步幅,总共384个字节。

const和mutating版本将具有 lot 的常用功能(您可以使用只读3D网格执行任何操作)。

以上示例的反动机是const视图包含一个const指针,因此变异视图必须执行const_cast才能使用它,或添加一个在非const指针中包含相同地址的额外字段。

1 个答案:

答案 0 :(得分:2)

如果const_iterator和迭代器之间存在继承,那么它应该采用另一种方式。这是一个const迭代器提供导航的基本能力,而可变迭代器增加了修改目标的能力(通过允许对const_iterator内部的受保护访问来实现)。

编辑:原始问题是关于从迭代器派生const_iterator的问题。这是一个坏主意,因为我和@David Rodriguez几乎完全同时指出了这一点。

通过修订后的问题,从const_iterator派生迭代器,David的评论提供了最佳响应。它可以做到,但通常不是一个好主意。

作为一个反问题:你在这种情况下使用继承有什么好处?如果有一个优点,是否有一个公共基类(iterator_impl),迭代器和const_iterator都可以从中获得相同的优势?