将shared_ptr
派生类型的a传递给采用shared_ptr
基本类型的a的函数的最佳方法是什么?
通常,我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));
但这似乎不太理想,原因有两个:
- 一个
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的“基础知识”演讲。
shared_ptr
?为什么没有const-reference呢?