是否可以将 vector<shared_ptr<T>> 传递给 const vector<shared_ptr<const T>>& 参数?

Is it possible to pass a vector<shared_ptr<T>> to a const vector<shared_ptr<const T>>& parameter?

假设我们有以下函数:

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 函数将无法修改向量,也无法修改其中的对象。)

简短的回答是 "No"。

给定一个 class 模板

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> 可能是唯一明智的做法。

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

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>> 调用的接口。