In D ist die Meta-Programmierung in den meisten Fällen nur Programmieren. Es gibt nicht wirklich eine Notwendigkeit für eine Bibliothek wie boost.mpl
Betrachten Sie zum Beispiel die Längen, die Sie in C++ gehen müssten, um ein Array von Zahlen zur Kompilierzeit zu sortieren. In D, tun Sie nur die offensichtliche Sache: std.algorithm.sort
import std.algorithm;
int[] sorted(int[] xs)
{
int[] ys = xs.dup;
sort(ys);
return ys;
}
pragma(msg, sorted([2, 1, 3]));
Dies gibt [1, 2, 3]
bei der Kompilierung verwenden. Hinweis: sort
ist nicht in die Sprache integriert und hat absolut keinen speziellen Code zum Arbeiten zur Kompilierzeit.
Hier ist ein weiteres Beispiel, das eine Lookup-Tabelle für die Fibonacci-Sequenz zur Kompilierzeit erstellt.
int[] fibs(int n)
{
auto fib = recurrence!("a[n-1] + a[n-2]")(1, 1);
int[] ret = new int[n];
copy(fib.take(n), ret);
return ret;
}
immutable int[] fibLUT = fibs(10).assumeUnique();
Hier wird fibLUT
benötigt vollständig zum Zeitpunkt der Kompilierung, wieder ohne besondere Kompilierung Code aufgebaut.
Wenn Sie mit Typen arbeiten möchten, gibt es einige Typenmetafunktionen in std.typetuple
. Zum Beispiel:
static assert(is(Filter!(isUnsigned, int, byte, ubyte, dstring, dchar, uint, ulong) ==
TypeTuple!(ubyte, uint, ulong)));
Diese Bibliothek, glaube ich, enthält die meisten Funktionen, die Sie von Fusion erhalten können. Denken Sie jedoch daran, dass Sie in D nicht so viel Template-Metaprogrammiermaterial verwenden müssen wie in C++, da der Großteil der Sprache ohnehin zur Kompilierzeit verfügbar ist.
Ich kann die Leistung nicht wirklich kommentieren, weil ich nicht große Erfahrung mit beiden habe. Mein Instinkt wäre jedoch, dass die Kompilierzeit von D'schneller ist, weil Sie in der Regel nicht zahlreiche Vorlagen instanziieren müssen. Natürlich sind C++ - Compiler ausgereifter, daher könnte ich hier falsch liegen. Der einzige Weg, den Sie wirklich herausfinden werden, besteht darin, es für Ihren speziellen Anwendungsfall zu versuchen.
Sie sollten nicht wirklich * Vorlage * Metaprogrammierung; D hat Kompilierfunktionsauswertung. – Mehrdad
@Mehrdad für alles? Sie können Find_if oder Template-Parameter transformieren? –
Nicht für alles (es sind immer noch Bugs zu beheben), aber für ziemlich viele Dinge. Es ist schwer, eine generische Antwort zu geben, aber wenn du ein bestimmtes Beispiel hast, poste es bitte und ich werde sehen, ob ich eine CTFE-Version davon finden und dir zeigen kann. – Mehrdad