我有一堆派生类存储为共享指针,我想知道是否有任何方法从对象内部获取weak_ptr
对象?获取指向派生类的弱指针
我使用shared_from_this()
功能尝试,但问题是,因为它是一个派生类,当我提出的基类继承enable_shared_from_this
,在派生类中调用shared_from_this()
它得到基类的shared_ptr
不的派生类我不能变成派生类
任何建议的shared_ptr
?
我有一堆派生类存储为共享指针,我想知道是否有任何方法从对象内部获取weak_ptr
对象?获取指向派生类的弱指针
我使用shared_from_this()
功能尝试,但问题是,因为它是一个派生类,当我提出的基类继承enable_shared_from_this
,在派生类中调用shared_from_this()
它得到基类的shared_ptr
不的派生类我不能变成派生类
任何建议的shared_ptr
?
正如@Torbjörn说,使用dynamic_pointer_cast<Derived>(base_ptr)
解决了这个问题,因为它让我shared_ptr
的下变换的继承,东西是不允许直接。
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);
}
为什么不能将'shared_ptr '变成'shared_ptr '?你不能使用'dynamic_pointer_cast (base_ptr)'? –
@Torbjörn我没有意识到'dynamic_pointer_cast(base_ptr)'存在,这正是我所需要的非常感谢! –
Ctrl