返回一个 const 和非 const 包装器对象
return a const and non const wrapper object
如果我希望一个自定义容器类通过一个类似迭代器的对象(实际上充当容器中某些数据的包装器)来访问其数据,并且我希望能够同时获得一个常量和非常量迭代器类对象,一个只允许读取,一个允许读写,所以我必须实现两个不同的类似迭代器的对象; 一个只允许读取,一个允许读写, 或者我可以将此功能包装在一个对象中。
问题是我必须按值返回此对象,但我无法返回一个无法直接放入非常量变量中的按值对象,例如
const accessor container::getConstAccessor(){/**/}
被滥用,如
accessor a=myContainer.getConstAccessor(); //effectively giving me a non const
我能看到的唯一解决方案是有两个访问器类/结构。一个作用于常量,一个作用于readWrite,无论它们在常量变量中还是非常量变量中。
这也许模拟了一个 constIterator 和 iterator,但这真的需要吗?您不能创建一个访问器并从容器返回 const 或非 const 版本吗?
我尝试改写这个问题几次,以使其最笼统,但如果它有意义,我并不完全确定。我希望是这样。
您不能创建一个访问器并从容器中返回 const 或 non const 版本吗?
没有。首先,您需要两个访问器,因为您必须检测*this
是否const
合格:
/* ??? */ my_container::getAccessor();
/* ??? */ my_container::getAccessor() const;
然后,如果按值返回,则无法强制getAccessor
的调用方将返回值存储在const
变量中。这就是为什么如果要在const
限定的访问器中强制实施不可变性,则需要两种不同的类型:
accessor my_container::getAccessor();
const_accessor my_container::getAccessor() const;
通过实现accessor
和const_accessor
,很可能可以通过一些可以用T
/const T
实例化的模板accessor_impl<T>
类来避免代码重复。
相关文章:
- 如何避免将 const 和非 const 成员函数输入到模板中的代码重复
- 如何避免重复的const和非const虚拟函数?是否可以
- 避免使用 auto 关键字从字面上复制 const 和非 const 的代码?
- 为什么在const和非const方法中删除代码重复不是不确定的行为
- 返回一个 const 和非 const 包装器对象
- 在使用指向 const 和非 const 方法的成员指针时减少模板专用化的数量
- 为什么BOOST.RANGE RANGE_BEGIN/END FREE功能对const和非const引用都重载
- Const和非常量函子
- 如何删除抽象类中类似的 const 和非 const 成员函数之间的代码重复
- 同一函数的const和非const版本——反模式
- 避免在const和非const成员函数中重复代码
- c++中返回引用的重载const和非const类方法
- 公开begin()和end()的const和非const版本,以使用智能指针迭代成员向量
- 树的const和非const版本的访问模式
- 应用于const和非const对象的引用返回方法
- 如何专门化const和非const容器的模板
- 定义遍历函数的const和非const版本
- 宏解决方案的重复,const和非const, getter
- Range-v3:使用view_facade来同时提供const和非const迭代器
- 不能使用操作符重载比较const和非const模板类型