规则迭代器(或类似的范围/视图类)是否应从const_iterator派生

Should the regular iterator (or a similar range / view class) derive from const_iterator?

本文关键字:是否 const iterator 派生 迭代器 规则 范围 视图      更新时间:2023-10-16

让常规迭代器(或类似的范围或视图类)从相应的const_iterator派生是一种好的做法吗?

这方面的动机

  • 共享代码,以及
  • 当迭代器/视图很大时,避免转换

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

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

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

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

编辑:关于从迭代器派生const_iterator的原始问题。正如我和@David Rodriguez几乎同时指出的那样,这是一个坏主意。

对于修改后的问题,即从const_iterator派生迭代器,David的评论提供了最佳答案。这是可以做到的,但通常不是一个好主意。

作为一个反问题:您认为在这种情况下使用继承有什么优势?如果有优势的话,那么拥有一个公共基类(迭代器_impl),迭代器和const_iterator都是从该基类派生的,这是否提供了相同的优势?

相关文章: