代码之家  ›  专栏  ›  技术社区  ›  MWB

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

  •  1
  • MWB  · 技术社区  · 10 年前

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

    这个 动机 因为这是

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

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

    常量和变异版本将具有 大量 通用功能(您可以使用只读三维网格执行的任何操作)。

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

    1 回复  |  直到 10 年前
        1
  •  2
  •   Dale Wilson    10 年前

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

    编辑:最初的问题是从迭代器派生const_iterator。正如我和大卫·罗德里格斯几乎同时指出的那样,这是个坏主意。

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

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