Was sind transparente Komparatoren?
In C++14, assoziative Container scheinen sich verändert zu haben, die von C++11 – [assoziativ.Bestand]/13 sagt:
Die member-Funktion Vorlagen
find
count
lower_bound
upper_bound
undequal_range
wird nicht an überlast Auflösung, es sei denn, die ArtCompare::is_transparent
vorhanden ist.
Was ist die Absicht, einen Komparator "transparent"?
C++14 auch eine Bibliothek mit Vorlagen wie diese:
template <class T = void> struct less {
constexpr bool operator()(const T& x, const T& y) const;
typedef T first_argument_type;
typedef T second_argument_type;
typedef bool result_type;
};
template <> struct less<void> {
template <class T, class U> auto operator()(T&& t, U&& u) const
-> decltype(std::forward<T>(t) < std::forward<U>(u));
typedef *unspecified* is_transparent;
};
Also zum Beispiel std::set<T, std::less<T>>
würde nicht haben einen transparenten Komparator, aber std::set<T, std::less<>>
würde haben.
Welches problem wird mit dieser lösen, und tut dies ändern, wie die standard-Containern zu arbeiten? Zum Beispiel die template Parameter std::set
noch Key, Compare = std::less<Key>, ...
also nicht die Standard-set verliert seine find
count
usw. Mitglieder?
InformationsquelleAutor der Frage Kerrek SB | 2013-12-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Siehe Dietmar und remyabel Antwort.
Nein, nicht standardmäßig.
Den neuen member-Funktion template überlastungen
find
etc. ermöglichen Sie einen Typ, der vergleichbar ist mit dem container-Taste, anstatt den key-Typ selbst. Sehen N3465 von Joaquín Mª López Muñoz für die Begründung und eine detaillierte, sorgfältig geschrieben Vorschlag, dieses feature hinzufügen.In der Bristol Sitzung der LWG vereinbart, dass der heteregeneous-lookup-Funktion wurde sinnvoll und wünschenswert, aber wir konnten nicht sicher sein, dass Joaquín Vorschlag würde sicher in allen Fällen. Die N3465 Vorschlag würde verursacht haben ernsthafte Probleme für einige Programme (siehe Auswirkungen auf bestehenden code Abschnitt). Joaquín bereit einen aktualisierten Entwurf für den Vorschlag mit einigen alternativen Implementierungen mit unterschiedlichen trade-offs, die sehr nützlich war, zu helfen, das LWG zu verstehen, die vor-und Nachteile, aber Sie alle riskierten, brechen einige Programme, die in irgendeiner Weise so gab es keinen Konsens, um die Funktion hinzufügen. Wir beschlossen, dass, obwohl es würde nicht sicher sein, um die Funktion hinzufügen bedingungslos, es wäre sicher, wenn es wurde standardmäßig deaktiviert und nur "opt-in".
Der wesentliche Unterschied der N3657 Vorschlag (das war ein last-minute-überarbeitung von mir und STL basieren auf N3465 und einer späteren unveröffentlichten Entwurf von Joaquín) war die Beurteilung der
is_transparent
Art, wie das Protokoll, das verwendet werden kann, um opt-in, um die neue Funktionalität.Wenn Sie nicht "transparent " functor" (d.h. man definiert einen
is_transparent
geben), dann wird der Container Verhalten sich genauso wie Sie es immer getan haben, und das ist immer noch der Standard.Iff, die Sie wählen, zu verwenden
std::less<>
(das ist neu für C++14) oder eine andere "transparente " functor" geben, dann bekommen Sie die neue Funktionalität.Mit
std::less<>
ist einfach mit alias-templates:Den Namen
is_transparent
kommt von STL ' s N3421die den "diamond-Operatoren" C++14. Eine "transparente " functor" ist eine, die akzeptiert ein argument-Typen (die nicht gleich sein müssen) und leitet einfach diese Argumente zu einem anderen Betreiber. Ein solcher Funktor ist zufällig genau das, was Sie wollen für heterogene lookup in der assoziativen Containern, also das der Typis_transparent
wurde Hinzugefügt, um alle diamond-Operatoren und als der tag-Typ angegeben, die neuen Funktionen aktiviert werden sollen, die in assoziativen Containern. Technisch werden die Behälter brauchen nicht eine "transparente " functor", nur einer, der unterstützt den Aufruf mit heterogener Arten (z.B. diepointer_comp
geben https://stackoverflow.com/a/18940595/981959 ist nicht transparent, nach STL-die definition, sondern die Definitionpointer_comp::is_transparent
ermöglicht es verwendet werden, um das problem zu lösen). Wenn Sie immer nur lookup in Ihremstd::set<T, C>
mit keys vom TypT
oderint
dannC
muss nur aufrufbar sein, mit Argumenten der ArtT
undint
(in beliebiger Reihenfolge), ist es nicht wirklich transparent ist. Wir verwendet, dass die Namen teilweise, weil wir konnte nicht einen besseren Namen (ich hätte es vorgezogenis_polymorphic
weil solche funktoren verwenden Sie statische Polymorphie, aber es gibt bereits einestd::is_polymorphic
Typ Merkmal bezieht sich auf die dynamische Polymorphie).InformationsquelleAutor der Antwort Jonathan Wakely
In C++11 gibt es nicht-Mitglied-Vorlagen
find()
lower_bound()
usw. Das heißt, nichts ist verloren durch diese änderung. Die member-templates eingeführt wurden, mit n3657 zu ermöglichen, heterogene Schlüssel wird mit dem assoziativen Container. Ich sehe kein konkretes Beispiel, wo dies nützlich ist, außer zum Beispiel, das ist gut und schlecht!Den
is_transparent
verwenden soll, um zu vermeiden, unerwünschte Konvertierungen. Wenn das Mitglied die Vorlagen waren ungezwungen, bestehenden code, der passieren kann, Objekte direkt, die würden sich bekehrt haben, ohne member-templates. Die Beispiel-use-case von n3657 ist das Auffinden eines Objekts in einerstd::set<std::string>
mit einem string-literal: mit dem C++11-definition einesstd::string
Objekt ist konstruiert, wenn die übergabe eines string-Literale in den entsprechenden member-Funktion. Mit der änderung ist es möglich, verwenden Sie die string-literal direkt. Wenn der zugrunde liegende Vergleich-Funktion-Objekt implementiert wird ausschließlich in Bezug aufstd::string
das ist schlecht, weil jetzt einstd::string
wäre für jeden Vergleich. Auf der anderen Seite, wenn der zugrunde liegende Vergleich-Funktion-Objekt kann einestd::string
- und ein string-literal, das kann vermeiden, Bau ein temporäres Objekt.Den verschachtelten
is_transparent
geben Sie in der Vergleich-Funktion-Objekt bietet eine Möglichkeit, um anzugeben, ob die Vorlagen-member-Funktion verwendet werden sollte: wenn die Vergleich-Funktion-Objekt kann im Umgang mit heterogenen Argumente, es definiert diese Art zu zeigen, dass es sich mit verschiedenen Argumenten effizient. Zum Beispiel der neue operator-Funktion-Objekte Stellvertretungoperator<()
und behaupten, Sie seien transparent. Dass, mindestens, arbeitet fürstd::string
hat überladen, weniger als Betreiber unterchar const*
als argument. Da diese Funktions-Objekte sind ebenfalls neu, auch wenn Sie das falsche tun (d.h. erfordern eine Umstellung für einige geben), wäre es zumindest nicht, dass eine Stille änderung resultiert in einem Leistungsabfall.InformationsquelleAutor der Antwort Dietmar Kühl
Das folgende ist alle copy-pasta von n3657.
Zitieren Yakk,
und n3657,
n3421 bietet ein Beispiel dafür,"Transparent Operator-Funktoren".
Den vollständige code ist hier.
InformationsquelleAutor der Antwort
Stephan T Lavavej redet über Probleme, wo der compiler hält, erstellen von Provisorien, und wie sein Vorschlag, transparent operator-funktoren zu lösen, wird dies in c++1y
GoingNative 2013 - Dont Hilfe der Compiler (um die Stunden-Marke)
InformationsquelleAutor der Antwort woolstar