C++ shared_ptr Gleichheits-operator
Den Gleichheitsoperator für shared_ptr ist wie folgt definiert:
template<class T, class U> inline bool operator==(
shared_ptr<T> const & a, shared_ptr<U> const & b)
{
return a.get() == b.get();
}
Dieser defekt zu sein scheint. Wäre es nicht besser gewesen, uns die Gleichberechtigung auf dem, was a und b
zeigen? Oder wäre das eine unfaire Einschränkung der Benutzerinnen und Benutzer der Bibliothek (in diesem
Sie haben, um eine Gleichheits-operator) ?
Wenn ich eine Karte oder eine hash_table mit shared_ptrs, dann wird die aktuelle definition
macht Gleichheit unbrauchbar. Betrachten Sie zum Beispiel
std::map<int, std::tr1::shared_ptr<T> > m1, m2;
Nicht überprüfen wir wollen, dass die ptrs für jedes int in m1 und m2 zeigen auf den selben Wert ?
Kann ich setze meine eigenen Gleichheit durch Abflachung m1, m2 aus (Bau-sets von jedem,
die Dereferenzierung shared_ptrs auf dem Weg). Gibt es eine STL-trick, werden dies zu erreichen
oder eine andere Möglichkeit zum testen der Gleichheit in der Gegenwart shared_ptrs ordentlich ?
- Es hängt davon ab, was meinen Sie mit Gleichheit. Für gewöhnliche Zeiger, das bedeutet "auf das gleiche Objekt". Mir scheint es sinnvoll, dieses Konzept zu erweitern Gleichheit zu shared_pointer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht gebrochen, weil ein
shared_ptr
ist konzeptionell ein Zeiger, daher implementiert es Zeiger-Weise Gleichheit. Wenn Sie testen zwei Zeiger für Gleichberechtigung, Sie wollen wissen, ob Sie auf den gleichen Platz im Speicher.Ich denke, die Idee ist, dass der Vergleich von zwei
shared_ptr
Instanzen ist in etwa so sinnvoll wie der Vergleich zweier Zeiger. Wenn Sie möchten, einestd::map
mitshared_ptr
s oder plain old Zeiger auf Objekte, Sie werden überschreiben, das Prädikat mit etwas vergleicht, dass die Spitzen-Objekte in jedem Fall.Im Fall des Vergleichs von zwei Karten, würden Sie wahrscheinlich wollen, verwenden Sie die version von
std::equal
nimmt ein Prädikat.Gerade lief in ein problem, wo könnte ich beide Arten von äquivalenz. Eine ungeordnete Reihe von shared_ptr, wo ich wollte, dass die Gleichwertigkeit auf der Grundlage der Inhalte von den Spitzen Objekten. Dies kann implementiert werden unter Verwendung einer Vorlage, die die Spezialisierung der hash und eine überladene ==. Jetzt habe ich einen anderen container, der enthält auch diese Zeiger (eine Kante Inzidenz Liste der möglichen), aber da wir bereits wissen, dass Sie einzigartig sind, weil wir verwendet die Menge, die wir uns verlassen können Zeiger Gleichwertigkeit. Obwohl die ursprüngliche Gleichwertigkeit würde auch funktionieren, könnte es effizienter sein, nur verlassen sich auf die Zeiger der Gleichwertigkeit im zweiten Fall-dies hängt von der Menge der Daten, die in den Instanzen verglichen werden.
So, um die Frage zu beantworten. Nein, es wäre nicht besser gewesen, weil, wie Sie die Flexibilität, abhängig von dem problem.