规则迭代器(或类似的范围/视图类)是否应从const_iterator派生
Should the regular iterator (or a similar range / view class) derive from const_iterator?
让常规迭代器(或类似的范围或视图类)从相应的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都是从该基类派生的,这是否提供了相同的优势?
相关文章:
- 是否应该在模板化代码中完全避免const
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 知道模板参数在编译时是否为 const char*?
- "this"指向的对象是否与 const 对象相同?
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- std::vector::assign/std::vector::operator=(const&) 是否保证在"this"中重用缓冲区?
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 如何检查函数是否真的获得了定义为 const 的变量?
- 修改数据是否由 const shared_ptr&Ok 传递?
- 从内部使用静态 std::string 的函数返回 const char * 是否安全?
- 是否可以交换在 c++ 中作为函数 func(say) 中的参数传递的 const 向量的两个元素,例如:vector<int>func (const vector<int>&
- 编译器在 const ref 类型参数上使用临时对象时是否应该警告不安全的行为?
- 将shared_ptr转换为<T> shared_ptr<const T>是否会更改它所指向的对象?
- 是否可以按模板类型更改静态 const 类成员的值
- 是否可以翻新(TR)QSTRING CONST
- 如何避免重复的const和非const虚拟函数?是否可以
- 添加C++前缀是否"const"硬件级别执行任何不同操作,或者只是对编码人员的保护?