我一直在用这个:
struct Bar;
struct Foo
{
virtual Bar * GetBar() { return nullptr; }
}
struct Bar : public Foo
{
virtual Bar * GetBar() { return this; }
}
Foo * b = new Bar();
//...
b->GetBar();
我使用了这个而不是慢dynamic_cast
。现在我已将代码更改为使用std::shared_ptr
std::shared_ptr<Foo> b = std::shared_ptr<Bar>(new Bar());
如何更改GetBar
方法以返回std::shared_ptr
并获得与原始指针相同的功能(不需要dynamic_cast)?
我试过这个:
struct Foo : public std::enable_shared_from_this<Foo>
{
virtual std::shared_ptr<Bar> GetBar() { return nullptr; }
}
struct Bar : public Foo
{
virtual std::shared_ptr<Bar> GetBar() { return shared_from_this(); }
}
但它不会编译
答案 0 :(得分:5)
std::enable_shared_from_this<Foo>::shared_from_this()
返回shared_ptr<Foo>
。所以你需要一个明确的指针向下转发。
virtual std::shared_ptr<Bar> GetBar() {
return std::static_pointer_cast<Bar>(shared_from_this());
}