2016-07-28 71 views
2

我有一堆派生类存储为共享指针,我想知道是否有任何方法从对象内部获取weak_ptr对象?获取指向派生类的弱指针

我使用shared_from_this()功能尝试,但问题是,因为它是一个派生类,当我提出的基类继承enable_shared_from_this,在派生类中调用shared_from_this()它得到基类的shared_ptr派生类我不能变成派生类

任何建议的shared_ptr

+2

为什么不能将'shared_ptr '变成'shared_ptr '?你不能使用'dynamic_pointer_cast (base_ptr)'? –

+0

@Torbjörn我没有意识到'dynamic_pointer_cast (base_ptr)'存在,这正是我所需要的非常感谢! – Ctrl

回答

0

正如@Torbjörn说,使用dynamic_pointer_cast<Derived>(base_ptr)解决了这个问题,因为它让我shared_ptr的下变换的继承,东西是不允许直接。

1

Usign CRTP可以实现它:

#include <memory> 

template<typename T> 
struct B: std::enable_shared_from_this<T> {}; 

struct D: B<D> {}; 

int main() { 
    std::shared_ptr<B<D>> b = std::make_shared<D>(); 
    std::shared_ptr<D> d = b->shared_from_this(); 
    std::weak_ptr<D> w = b->shared_from_this(); 
} 

如果你想有一个共同的,非模板基类,你可以依靠像双调度技术,如下面的例子:

#include <memory> 
#include <iostream> 

struct D1; 
struct D2; 

struct S { 
    void doSomething(std::weak_ptr<D1> weak) { std::cout << "D1" << std::endl; } 
    void doSomething(std::weak_ptr<D2> weak) { std::cout << "D2" << std::endl; } 
}; 

struct B: std::enable_shared_from_this<B> { 
    virtual void dispatch(S &) = 0; 
}; 

template<typename T> 
struct M: B { 
    void dispatch(S &s) override { 
     auto ptr = std::static_pointer_cast<T>(shared_from_this()); 
     s.doSomething(ptr); 
    } 
}; 

struct D1: M<D1> {}; 
struct D2: M<D2> {}; 

int main() { 
    std::shared_ptr<B> b = std::make_shared<D1>(); 
    S s; 

    b->dispatch(s); 
} 
相关问题