最佳答案
将派生类型的 shared_ptr
传递给采用基类型的 shared_ptr
的函数的最佳方法是什么?
我通常通过引用传递 shared_ptr
,以避免不必要的副本:
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 的 言归正传。