矢量的隐式转换>到向量 >

发布于 2024-11-08 07:09:34 字数 378 浏览 4 评论 0 原文

根据 此页面 您可以隐式转换 将shared_ptr 更改为shared_ptr。这很有道理。

但是,当我尝试将包含 shared_ptrstd::vector 转换为包含 shared_ptr 时遇到错误>。

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

According to this page you can implicitly convert shared_ptr<Foo> to shared_ptr<const Foo>. That makes good sense.

However, I run into an error when I try to convert a std::vector containing shared_ptr<Foo> to one containing shared_ptr<const Foo>.

Is there a good way to achieve this conversion?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

ぶ宁プ宁ぶ 2024-11-15 07:09:35

否:std::vector > 和 std::vector > 是不同的类型,因此不能将其中一种类型的对象视为另一种类型的对象。

如果您确实需要一个 std::vector; >,您可以轻松地使用 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(或< code>shared_ptrs,如果函数假定范围包含 shared_ptrs)。

当函数采用范围而不是容器时,您可以将该函数与底层数据解耦:数据实际是什么或如何存储不再重要,只要您可以按照需要使用的方式使用它即可它。

No: std::vector<shared_ptr<Foo> > and std::vector<shared_ptr<const Foo> > are different types, so you can't treat an object of one as an object of the other type.

If you really need a std::vector<shared_ptr<const Foo> >, you can easily create one with shared_ptrs to the same elements as the original:

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

However, if you write your code in terms of iterators, you shouldn't have any problem with this. That is, instead of using

void f(const std::vector<shared_ptr<const Foo> >&);

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

you should be using

template <typename ForwardIterator>
void f(ForwardIterator first, ForwardIterator last);

// used as:
std::vector<shared_ptr<const Foo> > v;
f(v.begin(), v.end());

This way, the function f just requires that it gets a range of things that are usable as pointers to const Foo (or shared_ptr<const Foo>s, if the function assumes that the range contains shared_ptrs).

When a function takes a range instead of a container, you decouple the function from the underlying data: it no longer matters what the data actually is or how it is stored, so long as you can use it in the way that you need to use it.

最佳男配角 2024-11-15 07:09:35

vectorvector 是两种不同的类型。因此,如果没有黑客攻击或脏代码,这是不可能的。

vector<TYPE> and vector<const TYPE> are two different types. So without a hack or dirty code it is not possible.

不爱素颜 2024-11-15 07:09:35

为什么需要一个 std::vector ? >?这
转换很容易;只需使用两个迭代器构造函数
std::向量。但在很多情况下,你不需要它:一般来说,
const 正确性与动态分配无关
对象,如果你需要一个 shared_ptr,有一个
当您从中提取对象时自动转换
向量。

Why do you need an std::vector<shared_ptr<Foo const> >? The
conversion is easy; just use the two iterator constructor of
std::vector. But in many cases, you won't need it: generally,
const-correctness isn't relevant for dynamically allocated
objects, and if you need a shared_ptr<Foo const>, there's an
automatic conversion when you extract the object from the
vector.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文