繁体   English   中英

矢量的隐式转换 <shared_ptr<Foo> &gt;向量 <shared_ptr<const Foo> &gt;

[英]Implicit conversion of vector<shared_ptr<Foo> > to vector<shared_ptr<const Foo> >

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

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

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

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

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

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 ,则为shared_ptr<const Foo> s)。

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

vector<TYPE>vector<const TYPE>是两种不同的类型。 所以没有hack或脏代码就不可能

为什么需要std::vector<shared_ptr<Foo const> > 转换很容易; 只需使用std::vector的两个迭代器构造函数。 但在许多情况下,您不需要它:通常,const-correctness与动态分配的对象无关,如果您需要shared_ptr<Foo const> ,则从向量中提取对象时会有自动转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM