Surowe wyszukiwanie wskaźnika dla zestawów unique_ptrs

Często pragnę napisać taki kod:

class MyClass
{
public:
  void addObject(std::unique_ptr<Object>&& newObject);

  void removeObject(const Object* target);

private:
  std::set<std::unique_ptr<Object>> objects;
};

Jednak znaczna część interfejsu std :: set jest w pewnym sensie bezużyteczna w przypadku std :: unique_ptrs, ponieważ funkcje wyszukiwania wymagają parametrów std :: unique_ptr (czego oczywiście nie mam, ponieważ są one własnością samego zestawu).

Mogę wymyślić dwa główne rozwiązania tego problemu.

Utwórz tymczasowy unique_ptr do wyszukiwania. Na przykład powyższy removeObject () może być zaimplementowany w następujący sposób:

void MyClass::removeObject(const Object* target)
{
  std::unique_ptr<Object> targetSmartPtr(target);
  objects.erase(targetSmartPtr);
  targetSmartPtr.release();
}

Zastąp zestaw mapą surowych wskaźników do unique_ptrs.

  // ...
  std::map<const Object*, std::unique_ptr<Object>> objects;
};

Jednak oba wydają mi się trochę głupie. W rozwiązaniu 1, erase () nie jest noexcept, więc tymczasowy unique_ptr może usunąć obiekt, którego tak naprawdę nie posiada, a 2 wymaga niepotrzebnego podwójnego przechowywania kontenera.

Wiem o kontenerach wskaźników Boosta, ale ich obecne funkcje są ograniczone w porównaniu do nowoczesnych standardowych kontenerów biblioteki C ++ 11.

Ostatnio czytałem o C ++ 14 i natknąłem się na „Dodawanie heterogenicznego wyszukiwania porównawczego do kontenerów asocjacyjnych”. Jednak w moim rozumieniu typy wyszukiwania muszą być porównywalne z typami kluczy, ale surowe wskaźniki nie są porównywalne z unique_ptrs.

Ktoś wie o bardziej eleganckim rozwiązaniu lub nadchodzącym dodatku do C ++, który rozwiązuje ten problem?

questionAnswers(6)

yourAnswerToTheQuestion