shared_ptr
将派生类型的 a 传递给采用基类型 a 的函数的最佳方法是什么shared_ptr
?
我通常通过shared_ptr
引用传递 s 以避免不必要的复制:
int foo(const shared_ptr<bar>& ptr);
但如果我尝试做类似的事情,这不起作用
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
我可以使用
foo(dynamic_pointer_cast<Base, Derived>(bar));
但这似乎不是最理想的,原因有两个:
- 对于一个简单的派生到基础的转换, A
dynamic_cast
似乎有点过分。 - 据我了解,
dynamic_pointer_cast
创建指针的副本(尽管是临时副本)以传递给函数。
有更好的解决方案吗?
后代更新:
原来是缺少头文件的问题。此外,我在这里尝试做的事情被认为是反模式。一般来说,
不影响对象生命周期的函数(即对象在函数的持续时间内保持有效)应该采用普通引用或指针,例如
int foo(bar& b)
.使用对象的函数(即给定对象的最终用户)应该采用
unique_ptr
按值,例如int foo(unique_ptr<bar> b)
. 调用者应该std::move
将值放入函数中。延长对象生命周期的函数应该采用
shared_ptr
按值,例如int foo(shared_ptr<bar> b)
. 避免循环引用的通常建议适用。
有关详细信息,请参阅 Herb Sutter 的“回归基础”演讲。