【问题标题】:return a const and non const wrapper object返回一个 const 和非 const 包装对象
【发布时间】:2018-06-01 19:24:45
【问题描述】:

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

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

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

被滥用

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

我能看到的唯一解决方案是拥有两个访问器类/结构。一种作用为 const,另一种作用为 readWrite,无论它们是在 const 还是非 const 变量中。

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

我尝试改写这个问题几次,以使其最笼统,但如果它有意义,我并不完全确定。我希望是的。

【问题讨论】:

  • 如果你让它不可复制,就不能从 const 中获取非 const 实例(讨厌的 const_cast 除外)
  • 关于为什么 STL 类(例如 std::vector)将 const_iteratoriterator 实现为两个不同的类。

标签: c++ iterator constants const-iterator


【解决方案1】:

你不能创建一个访问器并从容器中返回一个 const 或 non const 版本吗?

不是真的。首先,您需要两个访问器,因为您必须检测 *this 是否为 const-qualified:

/* ??? */ my_container::getAccessor();
/* ??? */ my_container::getAccessor() const;

然后,如果您按值返回,则无法强制getAccessor 的调用者将返回值存储在const 变量中。这就是为什么如果你想在const-qualified 访问器中强制执行不变性,你需要两种不同的类型:

accessor my_container::getAccessor();
const_accessor my_container::getAccessor() const;

很可能通过实现accessorconst_accessor 来避免代码重复,因为模板accessor_impl<T> 类可以用T/const T 实例化。

【讨论】:

  • 您可能想补充一点,应该可以使用Tconst T 实例化的模板来实现它们(无论T 在内部是否有意义)。
  • 感谢所有回复的人。最后,这个问题可能太脆弱了,但最后我按照建议做了,做了两个不同的访问器。我会将此标记为答案。
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
相关资源
最近更新 更多