C ++でオブジェクトのグラフに「クローン」関数を実装していますが、問題の一部は、同じオブジェクトへのポインターが2つある場合に、それが2回クローンされないようにすることです。これmap<void*, void*>
は、元のオブジェクトをキーとして保持し、複製されたバージョンを値として保持することによって行いました。オブジェクトのクローンを作成するときは、テンプレート関数を使用して、オブジェクトがマップにあるかどうかを確認します。ある場合は、で返しますstatic_cast<T*>
。そうでない場合は、クローンを作成して元のオブジェクトを保存し、暗黙的にマップに変換してクローンを作成しvoid*
ます。
このスキームの問題は、オブジェクトが2つの場所で異なるタイプ(たとえば、インターフェイスと具象タイプ)によって参照されている場合、キャスト先void*
が同じ値にならない可能性があることです。これは、オブジェクトが2回複製されることを意味します。
私はこれに対する既存の解決策をウェブで調べ、Boost.Serializationが同じ問題に対処しなければならないことに気づきました。しかし、そのソースを調べた後、オブジェクトへのポインターを実際に追跡する部分を見つけることができませんでした。
誰かがうまくいくデザインを提案することによって、またはこれを行うBoostコードの部分を指摘することによって助けることができますか?