実際の一意の 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);
これは、ここのようなカスタム ハッシュ/等価関数で逆参照することで可能になるはずですが、正確な方法はわかりません。