根据this page,您可以隐式地将shared_ptr<Foo>
转换为shared_ptr<const Foo>
。这很有道理。
但是,当我尝试将包含std::vector
的{{1}}转换为包含shared_ptr<Foo>
的{{1}}时,我遇到了错误。
有没有一种很好的方法来实现这种转换?
答案 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>
,那就是
从中提取对象时自动转换
矢量。