如果我想要一个自定义容器类通过类似迭代器的对象访问它的数据(实际上充当容器中某些数据的包装器),我希望能够同时获得const和非const类似迭代器的对象,一个只允许读取和一个读写,所以我必须实现两个不同的迭代器对象;一个只允许读取,一个允许读写,或者我可以将这个功能包装在一个对象中。
问题是我必须按值返回这个对象,但是我不能返回一个不能直接放入非常量变量的按值对象,如
const accessor container::getConstAccessor(){/**/}
像
一样被滥用accessor a=myContainer.getConstAccessor(); //effectively giving me a non const
我能看到的唯一解决方案是拥有两个存取类/结构。一个用于执行const的操作和一个用于执行readWrite的操作,无论它们是const还是非const变量。
这可能模拟一个constIterator和迭代器,但这真的需要吗?你能不能创建一个访问器并从容器中返回const或非const版本吗?
我试过几次改写这个问题,以使它最通用,但如果它有意义,我不完全确定。我希望如此。
答案 0 :(得分:4)
你能不能制作一个存取器并从容器中返回const或非const版本吗?
不是真的。首先,您需要两个访问者,因为您必须检测*this
是否const
- 是否合格:
/* ??? */ my_container::getAccessor();
/* ??? */ my_container::getAccessor() const;
然后,如果您按值返回,则无法强制getAccessor
的调用者将返回值存储在const
变量中。这就是为什么如果你想在const
合格的访问者中强制实现不变性,你需要两种不同的类型:
accessor my_container::getAccessor();
const_accessor my_container::getAccessor() const;
根据可以使用accessor
/ {{1}实例化的某些模板const_accessor
类,同时实现accessor_impl<T>
和T
,很可能避免代码重复}。