ゲームエンジン用の簡単なイベントマネージャークラスとリスナーを作成しようとしています。通常の実装(つまりMcShaffry)では、イベントマネージャーはリスナーを登録します。これにより、原則として、shared_ptrがプライベートメンバーとしてリスナーに保存されます。
多くの場合、shared_ptrなどは避けるべきだと言われています(例:ここ)。したがって、リスナーの所有権を共有せずにイベントマネージャーを実装する方法を見つけようとしています。
私が考えた方法の1つは、リスナーに一意のIDを割り当て、そのIDをイベントマネージャーに登録することです。次に、リスナーは、イベントマネージャーが更新された後、自分のIDでイベントが利用可能かどうかを、イベントマネージャーに「尋ねる」責任があります。
この場合、共有所有権を回避するためのよりクリーンな方法や標準的な方法があるかどうかを尋ねたいと思いますが、一般的にもそうです。たとえば、リスナーにも同じ問題があります。リスナーは、イベントを処理するときにそのメソッドを呼び出すことができるように、親(またはリッスンしているオブジェクト)へのポインターを格納する必要があります。