假设我们有以下功能:
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
函数将无法修改向量,也无法修改其中的对象。)
答案 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>>
调用的界面。