如何将派生类型的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的基础回顾讲座。
shared_ptr
?为什么不能传递bar
的 const 引用? - ipcdynamic
转换只需要用于向下转换。此外,传递派生指针应该完全可以工作。它将创建一个具有相同引用计数(并增加它)和指向基类的指针的新shared_ptr
,然后绑定到const引用。但是,既然您已经使用了引用,我不明白为什么您要使用shared_ptr
。取一个Base const&
并调用foo(*bar)
即可。 - Xeofoo(bar)
)在MSVC 2010中不起作用。 - Matt Klineshared_ptr
以传递给函数吗?我非常确定这是无法避免的。 - Mike Seymour