1

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

这样做的动机

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

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

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

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

4

1 回答 1

2

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

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

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

作为一个反问:您认为在这种情况下使用继承有什么好处?如果有优势,那么拥有一个从其派生 iterator 和 const_iterator 的公共基类 (iterator_impl) 是否提供相同的优势?

于 2015-03-02T21:27:07.370 回答