Was sind die Unterschiede zwischen Konzepten und Vorlagenbeschränkungen?
Ich will wissen, was sind die semantischen Unterschiede, die zwischen den C++ - volle Konzepte Vorschlag und Vorlage Einschränkungen (z.B. Einschränkungen, da erschien in Dlang oder die neuen Konzepte-lite Vorschlag für C++1y).
Was sind vollwertige Konzepte in der Lage zu tun, als Vorlage Einschränkungen können nicht tun?
InformationsquelleAutor der Frage Rayniery | 2013-03-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Abschnitt 3 die Einschränkungen Vorschlag deckt dieses in eine angemessene Tiefe.
Die Konzepte Vorschlag wurde auf der Rückseite Brenner für eine kurze Weile, in der Hoffnung, dass Engpässe (D. H. Konzepte-lite) können konkretisiert und umgesetzt in einer kürzeren Zeitskala, die derzeit mit dem Ziel für mindestens etwas in C++14. Die Einschränkungen Vorschlag dient als ein reibungsloser übergang zu einer späteren definition von Begriffen. Einschränkungen sind Teil die Konzepte Vorschlag und sind ein notwendiger Baustein in der definition.
In Design-of-Concept-Bibliotheken für C++Sutton und Stroustrup betrachten Sie die folgende Beziehung:
Schnell zusammenfassen und Ihre Bedeutung:
Also, wenn Sie hinzufügen von Axiomen (semantische Eigenschaften) - constraints (syntaktische Eigenschaften), Sie bekommen Konzepte.
Konzepte-Lite
Konzepte-lite Vorschlag bringt uns nur der erste Teil, den Einschränkungen, aber dies ist ein wichtiger und notwendiger Schritt in Richtung vollwertige Konzepte.
Einschränkungen
Einschränkungen sind alle über syntax. Sie geben uns eine Art von statisch anspruchsvollen Eigenschaften eines Typ zur compile-Zeit, so dass wir beschränken die verwendeten Typen als template-Argumente basierend auf Ihren syntaktischen Eigenschaften. Im aktuellen Vorschlag für die Einschränkungen, die Sie ausgedrückt werden, die mit einer Teilmenge der aussagenlogischen Kalkül mit logischen Verknüpfungen, wie
&&
und||
.Werfen wir einen Blick auf eine Einschränkung in Aktion:
Hier definieren wir eine Funktion Vorlage genannt
sort
. Neu hinzugekommen ist der requires-Klausel. Die requires-Klausel gibt einige Einschränkungen, über die template-Argumenten für diese Funktion. Insbesondere diese Einschränkung sagt, dass der TypCont
muss einSortable
geben. Eine nette Sache ist, dass es geschrieben werden können, werden in einer knapperen form:Nun, wenn Sie versuchen, pass alles, was nicht als
Sortable
zu dieser Funktion erhalten Sie einen netten Fehler, der sofort sagt Sie, dass die Art ableiten, die fürT
ist nicht einSortable
geben. Wenn Sie dies getan hatte, in C++11, würde Sie hatten einige schreckliche Fehler geworfen innen diesort
Funktion macht keinen Sinn, für niemanden.Einschränkungen Prädikate sind sehr ähnlich zu Typ-Merkmale. Nehmen Sie einige Vorlage-argument geben und Ihnen einige Informationen über Sie. Einschränkungen versuchen, Antworten auf folgende Fragen zu geben:
Jedoch, Einschränkungen sind nicht gedacht, um ersetzen Typ Merkmale. Stattdessen werden Sie hand in hand arbeiten. Einige Typ-Eigenschaften kann nun definiert werden in Konzepten und einige Konzepte in Bezug auf die Art der Züge.
Beispiele
So das wichtigste über Einschränkungen ist, dass Sie kümmern sich nicht über die Semantik ein jota. Einige gute Beispiele für Einschränkungen sind:
Equality_comparable<T>
: Prüft, ob der Typ hat==
beide Operanden vom gleichen Typ.Equality_comparable<T,U>
: Überprüft, ob es eine==
mit linken und rechten Operanden angegebenen TypenArithmetic<T>
: Überprüft ob der Typ einen arithmetischen Typ.Floating_point<T>
: Prüft, ob der Datentyp ist ein Gleitkommawert.Input_iterator<T>
: Prüft, ob der Typ unterstützt die syntaktischen Operationen, die ein input-iterator unterstützt werden muss.Same<T,U>
: Prüft, ob der angegebene Typ sind die gleichen.Können Sie versuchen, alle diese mit einem speziellen Konzepte-lite-build von GCC.
Jenseits Von Konzepten-Lite
Nun bekommen wir in alles, was jenseits der Konzepte-lite Vorschlag. Dies ist noch futuristischer aus als die Zukunft selbst. Alles von hier aus wird sich wahrscheinlich ändern, ganz ein bisschen.
Axiome
Axiome sind alle über Semantik. Sie definieren die Beziehung, Invarianten, Komplexität garantiert, und andere solche Dinge. Betrachten wir ein Beispiel.
Während der
Equality_comparable<T,U>
Einschränkung wird Ihnen sagen, dass es eineoperator==
nimmt, dass ArtenT
undU
es nicht Ihnen sagen, was Sie, dass der Betrieb bedeutet. Dafür haben wir das axiomEquivalence_relation
. Dieses axiom besagt, dass, wenn Objekte dieser beiden Typen im Vergleich mitoperator==
gebentrue
diese Objekte sind gleich. Dies mag redundant, aber es ist sicherlich nicht. Sie könnten leicht definieren, eineoperator==
dass stattdessen benahm sich wie einoperator<
. Sie würde böse sein zu tun, aber Sie könnten.Weiteres Beispiel ist ein
Greater
axiom. Es ist alles schön und gut zu sagen, dass zwei Objekte vom TypT
kann verglichen werden mit>
und<
Betreiber, aber was tun Sie bedeuten? DieGreater
axiom sagt, dass iffx
größer ist danny
danny
ist weniger alsx
. Die vorgeschlagene Spezifikation wie ein axiom, das sieht aus wie:Also Axiome beantworten Sie die folgenden Arten von Fragen:
Das heißt, Sie beschäftigen sich ausschließlich mit der Semantik von Typen und Operationen auf diesen Typen. Diese Dinge können nicht statisch überprüft. Wenn dieser aktiviert werden muss, ein Typ muss in irgendeiner Weise verkünden, dass Sie sich verpflichten diese Semantik.
Beispiele
Hier sind einige gängige Beispiele für Axiome:
Equivalence_relation
: Wenn zwei Objekte vergleichen==
Sie gleichwertig sind.Greater
: Wennx > y
danny < x
.Less_equal
: Wennx <= y
dann!(y < x)
.Copy_equality
: Fürx
undy
TypT
: wennx == y
ein neues Objekt vom gleichen Typ erstellt durch copy-KonstruktionT{x} == y
und nochx == y
(das heißt, es ist nicht-destruktiv).Konzepte
Nun Konzepte sind sehr einfach zu definieren, Sie sind einfach die Kombination von Einschränkungen und Axiome. Sie bieten eine abstrakte Anforderung über die syntax und Semantik eines Typs.
Als ein Beispiel, betrachten Sie die folgenden
Ordered
Konzept:Zunächst beachten Sie, dass für den template-Typ
T
zuOrdered
es müssen auch die Anforderungen derRegular
Konzept. DieRegular
- Konzept ist eine sehr grundlegende Anforderungen, die Art ist brav - es kann sein, gebaut, zerstört, kopiert und verglichen.Zusätzlich zu den Anforderungen, die
Ordered
erfordert, dassT
treffen eine Einschränkung und vier Axiome:Ordered
Typ muss eineoperator<
. Dies ist statisch geprüft, so dass es muss vorhanden.x
undy
TypT
:x < y
gibt eine strenge gesamte Bestellung.x
größer ist alsy
y
ist weniger alsx
und Umgekehrt.x
ist weniger als oder gleichy
y
ist nicht weniger alsx
und Umgekehrt.x
ist größer als oder gleichy
y
ist nicht größer alsx
und Umgekehrt.Kombination von Einschränkungen und Axiome wie diese bietet Sie Konzepte. Sie definieren die syntaktischen und semantischen Anforderungen für abstrakte Typen für die Verwendung mit algorithmen. Algorithmen müssen derzeit davon ausgehen, dass die verwendeten Typen werden unterstützt, bestimmte Vorgänge und express bestimmte Semantik. Mit Konzepten, wir werden in der Lage sein, um sicherzustellen, dass die Anforderungen erfüllt sind.
In die neuesten design-Konzepteder compiler überprüft nur noch, dass die syntaktische Anforderungen an ein Konzept erfüllt die Vorlage-argument. Die Axiome sind nicht gegengesteuert wird. Seit Axiome bezeichnen Semantik, die nicht statisch auswertbaren (oder oft unmöglich ist, überprüfen Sie ganz), der Autor eine Art müssten explizit erklären, dass Ihre Art erfüllt alle Anforderungen, die ein Konzept. Dies wurde bekannt als concept mapping in früheren Entwürfen, aber hat seitdem gewesen entfernt.
Beispiele
Hier sind einige Beispiele für Konzepte:
Regular
Arten sind constructable, zerstörbaren, kopierbar und können verglichen werden.Ordered
- Typen unterstützenoperator<
und haben eine strikte Summe der Bestellung und die andere Bestellung Semantik.Copyable
Typen kopieren constructable, zerstörbaren, und wennx
gleichy
undx
wird kopiert, die Kopie wird auch vergleichen Sie gleichy
.Iterator
Typen müssen verbunden Artenvalue_type
reference
difference_type
unditerator_category
die sich erfüllen müssen, bestimmte Konzepte. Sie unterstützen auchoperator++
und dereferenceable.Die Straße, um Konzepte
Einschränkungen sind der erste Schritt hin zu einer vollständigen Konzepte ein feature von C++. Sie sind ein sehr wichtiger Schritt, da Sie die statisch durchsetzbare Anforderungen der Typen, so dass wir schreiben können, viel sauberer template-Funktionen und Klassen. Jetzt können wir vermeiden, einige der Schwierigkeiten und der Hässlichkeit der
std::enable_if
und seine metaprogramming Freunde.Allerdings gibt es eine Reihe von Dingen, die Einschränkungen Vorschlag nicht tun:
Es ist nicht ein Konzept, definition language.
Einschränkungen sind nicht concept maps. Die Benutzer müssen nicht eigens kommentieren, Ihre Arten als die Einhaltung bestimmter Nebenbedingungen. Sie sind statisch geprüft, einfache compile-Zeit-Funktionen der Sprache.
Den Implementierungen von templates sind nicht eingeschränkt durch die Einschränkungen in Ihrer template-Argumente. Das ist, wenn Ihre Funktion Vorlage tut etwas mit einem Objekt von gebundenen Typ, der es nicht tun sollte, hat der compiler keine Möglichkeit zu diagnostizieren. Eine voll funktionsfähige Konzepte Vorschlag wäre in der Lage, dies zu tun.
Den Zwängen Vorschlag wurde extra so entworfen, dass eine vollständige Konzepte-Vorschlag eingeführt werden können. Mit etwas Glück, dass der übergang soll eine ziemlich glatte Fahrt. Die Konzepte der Gruppe suchen auf die Einführung von Einschränkungen für C++14 (oder in einem technischen Bericht bald nach), während full-Konzepte könnten entstehen irgendwann um C++17.
InformationsquelleAutor der Antwort
Siehe auch "was ist 'lite' über Konzepte lite" in Abschnitt 2.3 der aktuelle (März 12) Konzepte Telekonferenzen Minuten aufzeichnen und der Diskussion, die veröffentlicht wurden am gleichen Tag hier: http://isocpp.org/blog/2013/03/new-paper-n3576-sg8-concepts-teleconference-minutes-2013-03-12-herb-sutter .
InformationsquelleAutor der Antwort Herb Sutter
Meine 2 Cent:
Konzepte-lite Vorschlag ist nicht gemeint "Typ-Prüfung" Vorlage Umsetzung. I. e., Concepts-lite werden sicher (notionally) Schnittstellen-Kompatibilität bei der template-Instanziierung Website. Zitat aus dem Papier: "concepts-lite ist eine Erweiterung von C++, die es ermöglicht, die Nutzung von Prädikaten beschränken template-Argumente". Und das ist es. Es sagt nicht, dass die Vorlage Körpers überprüft werden (in isolation) gegen die Prädikate. Das bedeutet wahrscheinlich, dass es keine erste-Klasse Vorstellung von archtypes wenn Sie sprechen über Konzepte-lite. archtypes, wenn ich mich richtig erinnere, in der Konzepte-schwere Vorschlags-Typen, die anbieten, nicht weniger und nicht mehr zu befriedigen, die Umsetzung der Vorlage.
Konzepte-lite verwenden verherrlicht constexpr-Funktionen mit ein bisschen syntax-trick unterstützt durch den compiler. Keine änderungen in der lookup-Regeln.
Programmierer sind nicht erforderlich, schreiben Konzepte Karten.
Schließlich zitiere wieder "Die Einschränkungen Vorschlag nicht direkt ansprechen, der Spezifikation oder der Nutzung von Semantik; es richtet sich nur auf die überprüfung der syntax." Das würde bedeuten, dass Axiome nicht in den Geltungsbereich (bisher).
InformationsquelleAutor der Antwort Sumant