2

実際の一意の ID がスマート ポインター構造体/クラスのメンバーである、検索可能な GUID のコレクション (16 バイトとして格納) が必要です。これは、「最後の参照の削除」に基づいて他のオブジェクトによってカウントされ、ポイントされる参照std::shared_ptrです。しかし、私のスマート ポインター クラスのカスタムの性質のため、私は使用したくありませんshared_ptr

std::unordered_mapただし、ポインターのコレクションを保持するためにor std::unordered_set(十分に高速な場合) のようなものを使用したいと考えています。

スマート ポインターのアドレスは一意であるため、ハッシュとして使用するのに適していますが、テーブル内の検索可能なキーを GUID にする必要があります。を使用find(guid)して、正しいスマート ポインターをすばやく見つけることができます。

言葉で説明するのは難しいので、ここにいくつかのコードを示します。

class SmartPointer
{
public:
   GUID guid;
   int refCount; // Incremented/decremented when things point or stop pointing to it.
   void* actualObject; // The actual data attached to the smart pointer.
};

// Generate a unique 128-bit id.
GUID id;

// Create the smart pointer object.
SmartPointer* sp = new SmartPointer();
sp->guid = id;

// Create a set of SmartPointers.
std::unordered_set<SmartPointer*> set;
set.insert(sp);

// Need to find a SmartPointer based on a known GUID and not the pointer itself.
SmartPointer* found = set.find(id);

これは、ここのようなカスタム ハッシュ/等価関数で逆参照することで可能になるはずですが、正確な方法はわかりません。

4

1 に答える 1