Metaprogrammierung in C ++ und in D
Der template-Mechanismus in C++ nur versehentlich wurde nützlich für die template-metaprogramming. Auf der anderen Seite, D die speziell entworfen wurde, um dies zu erleichtern. Und anscheinend ist es auch einfacher zu verstehen (oder so habe ich gehört).
Habe ich keine Erfahrung mit D, aber ich bin neugierig, was ist es, was Sie tun können, in D, und Sie können nicht in C++, wenn es um die template-metaprogramming?
InformationsquelleAutor der Frage Paul Manta | 2011-09-04
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die zwei größten Dinge, die helfen, template metaprogramming in D sind template-Einschränkungen und
static if
- beide C++ könnte theoretisch hinzufügen und die profitieren würden ihn sehr.Vorlage Einschränkungen ermöglichen es Ihnen, eine Bedingung für eine Vorlage, die wahr sein muss, für die Vorlage zu können instanziiert werden. Dies ist beispielsweise die Unterschrift eines
std.algorithm.find
's überlastungen:Damit diese Vorlagen-Funktion in der Lage sein, die instanziiert werden sollen, die Art
R
muss ein Eingabebereich definiert durchstd.range.isInputRange
(soisInputRange!R
musstrue
), und das angegebene Prädikat muss eine binäre Funktion, die kompiliert und mit der angegebenen Argumente und gibt eine Art, die implizit konvertierbarbool
. Wenn das Ergebnis der Bedingung in der Vorlage Einschränkung istfalse
dann die Vorlage nicht kompilieren. Dadurch wird nicht nur schützen Sie aus dem fiesen Vorlage Fehler, die Sie in C++ als templates wird nicht kompiliert, mit Ihren jeweiligen Argumenten, aber es macht es so, dass Sie überlastet werden kann-Vorlagen auf Basis Ihrer Vorlage-Einschränkungen. Zum Beispiel gibt es eine weitere überladung vonfind
dieDauert es exakt die gleichen Argumente, aber seine Einschränkung ist anders. So werden verschiedene Arten der Arbeit mit verschiedenen überladungen der gleichen Vorlagen-Funktion, und die beste Umsetzung von
find
kann verwendet werden, für jeden Typ. Es gibt keine Möglichkeit, das zu tun diese Art der Sache sauber in C++. Mit ein wenig Vertrautheit mit den Funktionen und Vorlagen, die Sie in Ihrem typischen Vorlage Einschränkung, Vorlage Einschränkungen in D sind relativ leicht zu Lesen, während Sie brauchen etwas sehr kompliziertes template metaprogramming in C++, sogar zu versuchen, so etwas wie dieses, die Ihre durchschnittlichen Programmierer ist nicht in der Lage sein zu verstehen, geschweige denn tatsächlich auf eigene Faust tun. Boost ist ein Paradebeispiel dafür. Es hat einige tolle Sachen, aber es ist unglaublich kompliziert.static if
verbessert sich die situation noch weiter. Genau wie mit der Vorlage Einschränkungen, jede Bedingung, die ausgewertet werden können, zur compile-Zeit verwendet werden kann. z.B.Welche Filiale ist zusammengestellt hängt davon ab, welche Bedingung zuerst ausgewertet wird
true
. Also innerhalb einer Vorlage können Sie sich spezialisieren-Stücke seiner Umsetzung auf der Grundlage der Arten, dass die Vorlage instanziiert wurde oder basiert die auf etwas, die ausgewertet werden können, zur compile-Zeit. Zum Beispielcore.time
verwendetum code zu kompilieren, anders abhängig, ob das system bietet
clock_gettime
oder nicht (wennclock_gettime
da ist, er es verwendet, ansonsten benutzt esgettimeofday
).Wahrscheinlich die krassen Beispiel, dass ich gesehen habe, wo D verbessert die Vorlagen mit einem problem, das mein team bei der Arbeit lief in in C++. Mussten wir instanziieren die Vorlage unterschiedlich basierend auf, ob der Typ es gegeben wurde, abgeleitet von einer bestimmten Basisklasse oder nicht. Wir landeten mit einer Lösung auf Basis dieser stack overflow Frage. Es funktioniert, aber es ist ziemlich kompliziert, nur für die Prüfung, ob eine Art von einer anderen abgeleitet ist.
In D, aber alles, was Sie tun müssen ist, verwenden Sie die
:
Betreiber. z.B.Wenn
T
implizit konvertierbarU
(wie wäre es, wennT
wurden, stammen ausU
), dannfunc
kompiliert wird, in der Erwägung, dass, wennT
ist nicht implizit konvertierbarU
dann wird es nicht. Dass einfache Verbesserung macht auch basic template Spezialisierungen viel mächtiger (auch ohne Vorlage Einschränkungen oderstatic if
).Persönlich verwende ich selten templates in C++, anders als bei Containern und die gelegentliche Funktion, die in
<algorithm>
weil Sie so viel von einem Schmerz zu verwenden. Sie führen zu hässlichen Fehlern und sind sehr schwer zu tun, nichts mit Phantasie. Zu tun, was auch ein wenig kompliziert, Sie müssen sehr geschickt im Umgang mit templates und template-metaprogramming. Mit Vorlagen in D obwohl, es ist so einfach, dass ich Sie alle die Zeit nutzen. Die Fehler sind viel leichter zu verstehen und zu behandeln (aber Sie sind noch schlimmer als Fehler sind in der Regel mit nicht-Vorlagen-Funktionen), und ich don ' T haben, um herauszufinden, wie die Kraft der Sprache zu tun, was ich will, mit ausgefallenen metaprogramming.Gibt es keinen Grund, dass C++ nicht gewinnen viel von diesen Fähigkeiten, dass D (C++ - Konzepte helfen würde, wenn Sie jemals diese aussortiert), aber wenn Sie fügen einfache bedingte Kompilierung mit Konstrukten, ähnlich wie Vorlage Einschränkungen und
static if
C++, C++ - templates einfach nicht zu vergleichen mit D-Vorlagen in Bezug auf Benutzerfreundlichkeit und Leistung.InformationsquelleAutor der Antwort Jonathan M Davis
Ich glaube nichts ist besser qualifiziert, um zu zeigen, die unglaubliche power (TM) der D-template-system als dieser renderer fand ich vor Jahren:
Ja! Das ist eigentlich das, was erzeugt wird, durch den compiler ... es ist das "Programm", und ganz bunt, in der Tat.
Bearbeiten
Die Quelle scheint wieder online zu sein.
InformationsquelleAutor der Antwort bitmask
Die besten Beispiele D metaprogramming sind D-standard-library-Module, die machen starken Gebrauch von es vs. C++ Boost und STL-Module. Check-out D std.Angebotstd.Algorithmusstd.funktionale und std.Parallelität. Keiner von diesen wäre einfach zu implementieren in C++, zumindest mit der Art der sauberen, ausdrucksstarken API, die die D-Module haben.
Der beste Weg, um zu lernen, D metaprogramming, IMHO, ist von dieser Art von Beispielen. Ich lernte weitgehend durch das Lesen der code auf std.Algorithmus und std.Bereich, die geschrieben wurden von Andrei Alexandrescu (eine C++ template metaprogramming-guru, hat sich intensiv mit D). Dann habe ich das, was ich gelernt und dazu beigetragen, die std.Parallelität Modul.
Beachten Sie auch, dass D hat compile-Zeit-Funktion Auswertung (CTFE), die ähnlich zu C++1x s
constexpr
sondern viel mehr im Allgemeinen, dass eine große und wachsende Teilmenge der Funktionen, die ausgewertet werden können zur Laufzeit ausgewertet werden kann, unverändert zur compile-Zeit. Dies ist nützlich für die compile-time code generation und der generierte code kompiliert werden kann mit string Mixins in Verbindung.InformationsquelleAutor der Antwort dsimcha
Gut in D kann man leicht verhängen statische Einschränkungen für template-Parameter und code schreiben, der je nach der tatsächlichen template-argument mit statisch, wenn.
Es ist möglich, zu simulieren, dass für einfache Fälle mit C++ durch die Verwendung von template-Spezialisierung und andere tricks (siehe Schub), aber es ist ein PITA und sehr begrenzt der compiler nicht aussetzen viele details über die verschiedenen Arten.
Eine Sache, die C++ wirklich können einfach nicht tun, ist anspruchsvoll compile-time code generation.
InformationsquelleAutor der Antwort Trass3r
Hier ist ein Stück von D-code eine benutzerdefinierte-gemacht
map()
die gibt die Ergebnisse von Referenz -.Es erstellt zwei arrays der Länge 4, Karten jedes entsprechende paar von Elementen das element mit dem minimalen Wert, und multipliziert es mit 50, und speichert das Ergebnis wieder in das ursprüngliche array.
Einige wichtige Merkmale zu beachten sind die folgenden:
Die Vorlagen sind variadic:
map()
könnte eine beliebige Anzahl von Argumenten.Den code ist (relativ) kurze! Die
Mapper
Struktur, die die core-Logik, ist nur 15 Zeilen -- und doch, es kann so viel mit so wenig. Mein Punkt ist nicht, dass dies unmöglich ist in C++, aber das ist sicherlich nicht so kompakt und sauber.InformationsquelleAutor der Antwort Mehrdad
Schrieb ich meine Erfahrungen mit D ' s-Vorlagen, string Mixins in Verbindung und Vorlage Mixins in Verbindung: http://david.rothlis.net/d/templates/
Sollte es geben, die Ihnen einen Geschmack von dem, was möglich ist in D -- ich glaube nicht, dass in C++ können Sie den Zugriff auf eine id als string, Transformation, string zur compile-Zeit, und generieren von code aus den manipulierten string.
Mein Fazit: Extrem flexibel, extrem leistungsfähig und nutzbar, die von sterblichen, aber die Referenz-compiler ist noch etwas buggy, wenn es um die erweiterte compile-Zeit metaprogramming Zeug.
InformationsquelleAutor der Antwort David Röthlisberger
String-manipulation, auch string-parsing.
Dies ist ein MP-Bibliothek generiert recursive decent Parser basiert auf Grammatiken definiert, die in strings mit (mehr oder weniger) BNF. Ich habe nicht berührt es, in Jahren, aber es verwendet, um zu arbeiten.
InformationsquelleAutor der Antwort BCS
in D Sie können die Größe, der Typ und die verfügbaren Methoden und zu entscheiden, welche Implementierung Sie verwenden möchten
dies ist zum Beispiel in der
core.atomic
- ModulInformationsquelleAutor der Antwort ratchet freak
Nur gegen die D, ray-tracing-post, hier ist eine C++ compile time ray tracer (metatrace):
(by the way, verwendet es meist C++2003 metaprogramming; es wäre besser lesbar mit der neuen
constexpr
s)InformationsquelleAutor der Antwort Sebastian Mach
Gibt es ruhig ein paar Dinge, die Sie tun können, in template metaprogramming in D, dass du nicht C++. Das wichtigste ist, dass Sie tun können, template metaprogramming, OHNE SO VIEL VON EINEM SCHMERZ!
InformationsquelleAutor der Antwort Ralph Tandetzky