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?