C++ std::共享的ptr和双重回调

C++ std::共享的ptr和双重回调,c++,shared-ptr,double-dispatch,weak-ptr,C++,Shared Ptr,Double Dispatch,Weak Ptr,在继承层次结构中,我使用std::shared_ptr对对象执行某些逻辑。在某一点上,我需要根据对象的实际类型来处理这些对象,因此我使用了双重分派(即,我调用基类上的方法,然后基类又调用另一个具有实际类型的对象上的方法,请参见GoF中的访问者模式) 现在,我可以用正确的类型或副本传递对对象的引用。出于几个原因,复印件是不可能的。引用通常是可以的,因为调用发生在共享的\u ptr所在的范围之下,所以在调用发生时它不会被破坏。但是对于某些子类型,我需要将对象存储在STL容器中,因此我需要绝对确保它不

在继承层次结构中,我使用std::shared_ptr对对象执行某些逻辑。在某一点上,我需要根据对象的实际类型来处理这些对象,因此我使用了双重分派(即,我调用基类上的方法,然后基类又调用另一个具有实际类型的对象上的方法,请参见GoF中的访问者模式)

现在,我可以用正确的类型或副本传递对对象的引用。出于几个原因,复印件是不可能的。引用通常是可以的,因为调用发生在共享的\u ptr所在的范围之下,所以在调用发生时它不会被破坏。但是对于某些子类型,我需要将对象存储在STL容器中,因此我需要绝对确保它不会被破坏。显然,裸指针或新的共享ptr在这里不起作用,所以我需要获取对调用它的共享ptr的引用

现在我正在做以下工作: 我使用命名的构造函数而不是真实的构造函数来创建对象。这将在对象内部设置一个弱的\u ptr,并为对象的使用提供一个共享的\u ptr。当双重回调发生时,我从弱的ptr获取一个新的共享ptr并将其存储在容器中,这样对象就不会被破坏。然而,这使得我的构建逻辑非常难看


有更好的方法吗?

std::enable\u shared\u from\u this
-然后您可以随时从对象中提取共享的\u ptr


它与您现在使用的
弱ptr
没有太大区别,但它是一个干净且公认的习惯用法。

std::enable_shared_from_this
-然后您可以随时从对象中提取共享ptr


它与您现在使用的
弱ptr
没有太大区别,但它是一个干净且公认的习惯用法。

您可以使用将共享ptr传递给具有正确类型的对象。

您可以使用将共享ptr传递给具有正确类型的对象