常规迭代器(或类似的范围/视图 class)是否应该从 const_iterator 派生?
Should the regular iterator (or a similar range / view class) derive from const_iterator?
从相应的 const_iterator 派生常规迭代器(或类似的范围或视图 class)是一个好习惯吗?
动机是
- 共享代码,
- 避免转换,当迭代器/视图很大时。
例如,考虑 3D 网格的视图,即 网格的一部分。它可能包含 1 个指针、3 个大小和 2-3 个步长,总共 384 个字节。
const 和 mutating 版本将具有 很多 通用功能(您可以使用只读 3D 网格执行的任何操作)。
上面例子的反动机是常量视图包含一个常量指针,所以变异视图必须做一个const_cast
才能使用它,或者在非常量指针中添加一个包含相同地址的额外字段。
如果 const_iterator 和迭代器之间存在继承关系,那么它应该是相反的。这是一个 const 迭代器提供了基本的导航能力,可变迭代器增加了修改目标的能力(通过允许对 const_iterator 内部的受保护访问来实现)。
编辑:最初的问题询问关于从迭代器派生 const_iterator。这是一个坏主意,因为我和@David Rodriguez 几乎同时指出。
修改后的问题,从 const_iterator 派生迭代器,David 的评论提供了最好的回应。可以做到,但通常不是一个好主意。
作为反问:您认为在这种情况下使用继承有什么优势?如果有优势,那么迭代器和 const_iterator 都从中导出的公共基础 class (iterator_impl) 是否提供相同的优势?
从相应的 const_iterator 派生常规迭代器(或类似的范围或视图 class)是一个好习惯吗?
动机是
- 共享代码,
- 避免转换,当迭代器/视图很大时。
例如,考虑 3D 网格的视图,即 网格的一部分。它可能包含 1 个指针、3 个大小和 2-3 个步长,总共 384 个字节。
const 和 mutating 版本将具有 很多 通用功能(您可以使用只读 3D 网格执行的任何操作)。
上面例子的反动机是常量视图包含一个常量指针,所以变异视图必须做一个const_cast
才能使用它,或者在非常量指针中添加一个包含相同地址的额外字段。
如果 const_iterator 和迭代器之间存在继承关系,那么它应该是相反的。这是一个 const 迭代器提供了基本的导航能力,可变迭代器增加了修改目标的能力(通过允许对 const_iterator 内部的受保护访问来实现)。
编辑:最初的问题询问关于从迭代器派生 const_iterator。这是一个坏主意,因为我和@David Rodriguez 几乎同时指出。
修改后的问题,从 const_iterator 派生迭代器,David 的评论提供了最好的回应。可以做到,但通常不是一个好主意。
作为反问:您认为在这种情况下使用继承有什么优势?如果有优势,那么迭代器和 const_iterator 都从中导出的公共基础 class (iterator_impl) 是否提供相同的优势?