是否可以将 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>>
调用的接口。
假设我们有以下函数:
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>>
调用的接口。