【发布时间】:2022-08-11 00:28:03
【问题描述】:
Const casting container value-types 似乎不可能。另一个问题中的评论建议将迭代器作为一种解决方案,但并未详细说明。 由于我似乎不能简单地将容器从非 const 转换为 const 版本作为函数参数,所以我到达 Iterators 可能能够完成这项工作。
我实际上有一个vector<shared_ptr<Thing> > 被视为const vector<shared_ptr<Thing const> >。
有了它,我打算在其他结构中使用shared_ptr<Thing const> 作为进一步的参考,而不允许这些结构改变Things。这些结构可以创建他们自己的对象,由他们自己的 shared_ptr 存储,如果他们想要在他们的容器中稍微不同的内容,同时仍然积极地与其他对象共享大部分 Things。
所以我需要shared_ptr<const Thing>& 或const shared_ptr<const Thing>& 从迭代器通过序列。任何一种都足够了,但只是因为在这个例子中传递引用可以无所谓,因为 shared_ptr 的复制语义就是这样。
然而,即使只使用默认的const_iterator,由cbegin()、c.end() 等检索,也会给我一个const shared_ptr<Thing>&。
编辑:复制元素的矢量元素在技术上是一种方式,就像在另一个问题中一样,但由于界面原因是不受欢迎的。我要在这里重新解释,而不是复制。
关于解决方法可能存在的任何建议?
-
使用一些代码,您描述的问题会更清楚。代码说一千多个字
-
@463035818_is_not_a_number 代码,描述了一般意图在上面的链接问题中提供。我将重新安排问题中的一些内容以使其成为焦点。至于用什么代码来解决它,这就是问题所在。
-
这个问题应该是独立的。如果其他问题中的代码是您问题的基础,则将其添加到问题中(当然要适当注明出处)
-
当您说“另一个问题中的评论建议使用迭代器作为解决方案,但没有详细说明”时,您是否指的是“通过
fn({vc.begin(), vc.end()})调用它,请求显式转换”?没有太多细节可以说。它只是调用std::vector<const Thingy*>的构造函数,因此该函数无法修改Thingys。 -
这里没有低成本的解决方法。如果您需要传递
vector<shared_ptr<Thing const>>的参数,但您有vector<shared_ptr<Thing>>,则需要构建参数。我会提供一个辅助工厂函数vector<shared_ptr<Thing const>> to_const(vector<shared_ptr<Thing>> const& v) {/*code*/}。
标签: c++ iterator c++17 const-correctness const-pointer