C++ shared_ptr return this 来自派生方法
C++ shared_ptr return this from derived method
我一直在用这个:
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
方法更改为 return 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(); }
}
但是编译不了
std::enable_shared_from_this<Foo>::shared_from_this()
returns一个shared_ptr<Foo>
。所以你需要一个明确的指针向下转换。
virtual std::shared_ptr<Bar> GetBar() {
return std::static_pointer_cast<Bar>(shared_from_this());
}
我一直在用这个:
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
方法更改为 return 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(); }
}
但是编译不了
std::enable_shared_from_this<Foo>::shared_from_this()
returns一个shared_ptr<Foo>
。所以你需要一个明确的指针向下转换。
virtual std::shared_ptr<Bar> GetBar() {
return std::static_pointer_cast<Bar>(shared_from_this());
}