vector <shared_ptr <foo>&gt;的隐式转换to vector <shared_ptr <const foo =“”>&gt; </shared_ptr <const> </shared_ptr <foo>

时间:2011-05-18 05:47:01

标签: c++ vector casting shared-ptr implicit-conversion

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

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

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

3 个答案:

答案 0 :(得分:9)

否: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)。

当一个函数取一个范围而不是一个容器时,你将该函数与底层数据分离:它不再重要的是数据实际是什么或它是如何存储的,只要你能以你的方式使用它需要使用它。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

为什么需要std::vector<shared_ptr<Foo const> >?该 转换很容易;只需使用两个迭代器构造函数 std::vector。但在许多情况下,你不需要它:一般来说, const-correctness与动态分配无关 对象,如果你需要shared_ptr<Foo const>,那就是 从中提取对象时自动转换 矢量。