是否可以传递矢量<shared_ptr <t>&gt;到const向量<shared_ptr <const t =“”>&gt;&amp;参数?

时间:2017-02-27 18:24:55

标签: c++ type-conversion const shared-ptr

假设我们有以下功能:

void doStuff(const std::vector<std::shared_ptr<const Foo>>& fs) { }

有没有办法(安全地)将std::vector<std::shared_ptr<Foo>>传递给此参数?例如:

std::vector<std::shared_ptr<Foo>> foos;
doStuff(foos);

这种隐式转换失败了,但是可以使用强制转换安全地完成吗? (这似乎在理论上是安全的,因为doStuff函数将无法修改向量,也无法修改其中的对象。)

2 个答案:

答案 0 :(得分:2)

简短的回答是&#34;否&#34;。

给出一个类模板

template <typename T> struct Foo {};

Foo<int>Foo<const int>是两种不同的类型。这两种类型之间没有隐式转换。

我的建议是将doStuff作为功能模板。

template <typename T>
void doStuff(const std::vector<T>& fs) { }

template <typename T>
void doStuff(const std::vector<std::shared_ptr<T>>& fs) { }

如果您无法修改doStuff,则doStuff复制shared_ptr<Foo>代码可能是唯一合理的事情。

答案 1 :(得分:0)

没有。但你可以做的是改变你的界面,使其更具包容性。你写道:

void doStuff(std::vector<std::shared_ptr<Foo const>> const& fs) { }

但你真正想要的只是std::shared_ptr<const Foo>的一些连续范围吗?所以让我们改为:

void doStuff(gsl::span<std::shared_ptr<Foo const>> fs) { }

但实际上,我们是否需要共享指针本身指向const或者它们是const是否足够?

void doStuff(gsl::span<std::shared_ptr<Foo> const> fs) { }

现在我们有了一个可以用std::vector<shared_ptr<Foo>>调用的界面。