矢量<shared_ptr<Foo>>到矢量<shared_ptr<const Foo 的隐式转换> >

Implicit conversion of vector<shared_ptr<Foo> > to vector<shared_ptr<const Foo> >

本文关键字:gt lt ptr Foo shared 转换 矢量 const      更新时间:2023-10-16

根据此页面,您可以将shared_ptr<Foo>隐式转换为shared_ptr<const Foo>。这是有道理的。

但是,当我尝试将包含shared_ptr<Foo>std::vector转换为包含shared_ptr<const Foo>的时,我遇到了错误。

有没有实现这种转换的好方法?

否:std::vector<shared_ptr<Foo> >std::vector<shared_ptr<const Foo> > 是不同的类型,因此不能将一个对象视为另一种类型的对象。

如果你真的需要一个std::vector<shared_ptr<const Foo> >,你可以很容易地创建一个与原始元素相同的元素shared_ptr s:

std::vector<shared_ptr<Foo> > v;
std::vector<shared_ptr<const Foo> > cv(v.begin(), v.end());

但是,如果您根据迭代器编写代码,则应该没有任何问题。 也就是说,而不是使用

void f(const std::vector<shared_ptr<const Foo> >&);
// used as:
std::vector<shared_ptr<const Foo> > v;
f(v);

你应该使用

template <typename ForwardIterator>
void f(ForwardIterator first, ForwardIterator last);
// used as:
std::vector<shared_ptr<const Foo> > v;
f(v.begin(), v.end());

这样,函数f只需要它获取一系列可用作指向const Foo的指针的东西(或shared_ptr<const Foo> s,如果函数假定该范围包含 shared_ptr s)。

当函数采用范围而不是容器时,您将函数与基础数据分离:只要您可以按照需要使用的方式使用它,数据的实际内容或存储方式就不再重要。

vector<TYPE>vector<const TYPE>是两种不同的类型。因此,如果没有黑客或脏代码,这是不可能的

为什么需要std::vector<shared_ptr<Foo const> >? 这转换很容易;只需使用两个迭代器构造函数 std::vector . 但在许多情况下,您不需要它:通常,常量正确性与动态分配无关对象,如果您需要shared_ptr<Foo const>,则有一个从向量。