継承階層内のオブジェクトに std::shared_ptrs を使用しているロジックがあります。ある時点で、これらのオブジェクトを実際の型に応じて処理する必要があるため、二重ディスパッチを使用しています (つまり、基本クラスでメソッドを呼び出し、次に、実際の型を持つ別のオブジェクトのメソッドを呼び出します。例を参照してください)。 GoF の訪問者パターン)。
この時点で、オブジェクトへの参照を正しい型またはコピーで渡すことができます。いくつかの理由から、コピーは論外です。呼び出しは shared_ptr が存在するスコープより下のスコープで発生するため、参照は通常は問題ありません。したがって、この呼び出しが発生している間は破棄されません。ただし、一部のサブタイプでは、オブジェクトを STL コンテナーに格納する必要があるため、オブジェクトが破棄されないようにする必要があります。明らかに、裸のポインターまたは新しい shared_ptr はここでは機能しないため、これが呼び出された shared_ptr への参照を取得する必要があります。
現在、私は次のことを行っています。実際のコンストラクターではなく、名前付きコンストラクターを使用してオブジェクトを作成します。これにより、オブジェクト内に weak_ptr が設定され、オブジェクトを使用するための shared_ptr が提供されます。二重のコールバックが発生すると、weak_ptr から新しい shared_ptr を取得し、これをコンテナーに格納するので、オブジェクトは破棄されません。ただし、これにより、構築のロジックが非常に醜くなります。
これを行うより良い方法はありますか?