Rohe Zeigersuche für Sätze von unique_ptrs
Ich stelle oft fest, dass ich folgenden Code schreiben möchte:
class MyClass
{
public:
void addObject(std::unique_ptr<Object>&& newObject);
void removeObject(const Object* target);
private:
std::set<std::unique_ptr<Object>> objects;
};
Ein Großteil der std :: set-Schnittstelle ist jedoch mit std :: unique_ptrs nutzlos, da für die Suchfunktionen std :: unique_ptr-Parameter erforderlich sind (die ich offensichtlich nicht habe, weil sie dem set selbst gehören).
Ich kann mir zwei Hauptlösungen dafür vorstellen.
Erstellen Sie ein temporäres unique_ptr für die Suche. Zum Beispiel könnte das obige removeObject () wie folgt implementiert werden:
void MyClass::removeObject(const Object* target)
{
std::unique_ptr<Object> targetSmartPtr(target);
objects.erase(targetSmartPtr);
targetSmartPtr.release();
}
Ersetzen Sie die Menge durch eine Karte mit unformatierten Zeigern auf unique_ptrs.
// ...
std::map<const Object*, std::unique_ptr<Object>> objects;
};
Beides kommt mir allerdings etwas blöd vor. In Lösung 1 ist erase () nicht noexcept, sodass das temporäre unique_ptr möglicherweise das Objekt löscht, das es nicht wirklich besitzt, und 2 den doppelten Speicherplatz für den Container unnötig erfordert.
Ich kenne die Pointer-Container von Boost, aber ihre aktuellen Funktionen sind im Vergleich zu modernen C ++ 11-Standardbibliothekscontainern begrenzt.
Ich habe kürzlich über C ++ 14 gelesen und bin auf "Hinzufügen einer heterogenen Vergleichssuche zu assoziativen Containern" gestoßen. Nach meinem Verständnis müssen die Lookup-Typen mit den Schlüsseltypen vergleichbar sein, aber rohe Zeiger sind nicht mit unique_ptrs vergleichbar.
Kennt jemand eine elegantere Lösung oder eine bevorstehende Erweiterung von C ++, die dieses Problem löst?