Welches Problem löst das?
Siehe Dietmars Antwort und Remyabels Antwort .
und ändert dies die Funktionsweise von Standardcontainern?
Nein, nicht standardmäßig.
Mit den Überladungen der neuen Elementfunktionsvorlagen find
usw. können Sie einen Typ verwenden, der mit dem Schlüssel des Containers vergleichbar ist, anstatt den Schlüsseltyp selbst zu verwenden. Siehe N3465 von Joaquín Mª López Muñoz für eine Begründung und einen detaillierten, sorgfältig geschriebenen Vorschlag, diese Funktion hinzuzufügen.
Auf dem Treffen in Bristol stimmte die LWG zu, dass die heterogene Suchfunktion nützlich und wünschenswert war, aber wir konnten nicht sicher sein, dass Joaquins Vorschlag in allen Fällen sicher sein würde. Der N3465-Vorschlag hätte bei einigen Programmen ernsthafte Probleme verursacht (siehe Abschnitt Auswirkungen auf den vorhandenen Code ). Joaquín bereitete einen aktualisierten Entwurf eines Vorschlags mit einigen alternativen Implementierungen mit unterschiedlichen Kompromissen vor, was der LWG sehr hilfreich war, um die Vor- und Nachteile zu verstehen, aber alle riskierten, einige Programme auf irgendeine Weise zu brechen, sodass es keinen Konsens gab, die Funktion hinzuzufügen. Wir haben entschieden, dass es zwar nicht sicher ist, die Funktion unbedingt hinzuzufügen, aber sicher ist, wenn sie standardmäßig deaktiviert ist und nur "Opt-In" ist.
Der Hauptunterschied des N3657- Vorschlags (der in letzter Minute von mir und STL auf der Grundlage von N3465 und einem später unveröffentlichten Entwurf von Joaquín überarbeitet wurde ) bestand darin, den is_transparent
Typ als Protokoll hinzuzufügen, mit dem die neue Funktionalität aktiviert werden kann.
Wenn Sie keinen "transparenten Funktor" verwenden (dh einen, der einen is_transparent
Typ definiert ), verhalten sich die Container genauso wie immer, und das ist immer noch die Standardeinstellung.
Wenn Sie sich für die Verwendung std::less<>
(die für C ++ 14 neu ist) oder einen anderen "transparenten Funktortyp" entscheiden, erhalten Sie die neue Funktionalität.
Die Verwendung std::less<>
von Alias-Vorlagen ist einfach:
template<typename T, typename Cmp = std::less<>, typename Alloc = std::allocator<T>>
using set = std::set<T, Cmp, Alloc>;
Der Name is_transparent
stammt von STLs N3421, das C ++ 14 die "Diamantoperatoren" hinzufügte. Ein "transparenter Funktor" akzeptiert alle Argumenttypen (die nicht identisch sein müssen) und leitet diese Argumente einfach an einen anderen Operator weiter. Ein solcher Funktor ist genau das, was Sie für eine heterogene Suche in assoziativen Containern benötigen. Daher wurde der Typ is_transparent
allen Diamantoperatoren hinzugefügt und als Tag-Typ verwendet, um anzugeben, dass die neue Funktionalität in assoziativen Containern aktiviert werden soll. Technisch gesehen benötigen die Container keinen "transparenten Funktor", sondern nur einen, der das Aufrufen mit heterogenen Typen unterstützt (z. B. ist der pointer_comp
Typ in https://stackoverflow.com/a/18940595/981959 gemäß der STL-Definition nicht transparent.pointer_comp::is_transparent
ermöglicht die Verwendung zur Lösung des Problems). Wenn Sie immer nur std::set<T, C>
mit Schlüsseln vom Typ nachschlagen T
oder int
dann C
nur mit Argumenten vom Typ T
und int
(in jeder Reihenfolge) aufrufbar sein müssen, muss es nicht wirklich transparent sein. Wir haben diesen Namen teilweise verwendet, weil wir keinen besseren Namen finden konnten (ich hätte es vorgezogen, is_polymorphic
weil solche Funktoren statischen Polymorphismus verwenden, aber es gibt bereits ein std::is_polymorphic
Typmerkmal, das sich auf dynamischen Polymorphismus bezieht).