返回一个const和非const包装器对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了返回一个const和非const包装器对象相关的知识,希望对你有一定的参考价值。

如果我想要一个自定义容器类通过类似迭代器的对象访问它的数据(实际上充当容器中某些数据的包装器),我希望能够同时获得const和非const迭代器对象,一个只允许读取和一个读写,所以我必须实现两个不同的迭代器对象;一个只允许读取,一个允许读写,或者我可以将这个功能包装在一个对象中。

问题是我必须按值返回这个对象,但是我不能返回一个不能直接放入非const变量的by-value对象

const accessor container::getConstAccessor(){/**/}

被误用了

accessor a=myContainer.getConstAccessor(); //effectively giving me a non const

我能看到的唯一解决方案是拥有两个存取类/结构。一个用于执行const的操作和一个用于执行readWrite的操作,无论它们是const还是非const变量。

这可能模拟一个constIterator和迭代器,但这真的需要吗?你能不能创建一个访问器并从容器中返回const或非const版本吗?

我试过几次改写这个问题,以使它最通用,但如果它有意义,我不完全确定。我希望如此。

答案

你能不能创建一个访问器并从容器中返回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 / const_accessor实例化的一些模板accessor_impl<T>类来实现Tconst T,很可能可以避免代码重复。

以上是关于返回一个const和非const包装器对象的主要内容,如果未能解决你的问题,请参考以下文章

如何编写一个返回对成员对象的引用的 const 访问器,以便可以对其进行编辑?

typedef 模板,接受指向 const 和非 const 函数的指针

C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用

为啥 lambda auto& 参数选择 const 重载?

const函数

为啥 const 方法不能返回非常量引用?