In D, per la maggior parte, la meta-programmazione è solo programmazione. Non c'è davvero alcun bisogno di una libreria come boost.mpl
Ad esempio, considerare le lunghezze in cui dovresti andare in C++ per ordinare una matrice di numeri in fase di compilazione. In D, basta fare la cosa più ovvia: utilizzare std.algorithm.sort
import std.algorithm;
int[] sorted(int[] xs)
{
int[] ys = xs.dup;
sort(ys);
return ys;
}
pragma(msg, sorted([2, 1, 3]));
Questo stampa [1, 2, 3]
al momento della compilazione. Nota: sort
non è incorporato nella lingua e non ha assolutamente alcun codice speciale per lavorare in fase di compilazione.
Ecco un altro esempio che costruisce una tabella di ricerca per la sequenza di Fibonacci in fase di compilazione.
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();
Qui, fibLUT
è costruito interamente in fase di compilazione, ancora una volta senza alcun codice tempo di compilazione speciali.
Se si desidera lavorare con i tipi, esistono alcune metapodi di tipo in std.typetuple
. Ad esempio:
static assert(is(Filter!(isUnsigned, int, byte, ubyte, dstring, dchar, uint, ulong) ==
TypeTuple!(ubyte, uint, ulong)));
Quella libreria, credo, contiene la maggior parte delle funzionalità che è possibile ottenere da Fusion. Ricorda, però, non hai davvero bisogno di usare molto materiale di meta-programmazione in D come in C++, perché la maggior parte della lingua è disponibile comunque in fase di compilazione.
Non posso davvero commentare le prestazioni perché non ho una vasta esperienza con entrambi. Tuttavia, il mio istinto sarebbe che l'esecuzione del tempo di compilazione di D'è più veloce perché generalmente non è necessario istanziare numerosi modelli. Certamente, i compilatori C++ sono più maturi, quindi potrei sbagliarmi qui. L'unico modo per scoprirlo è provarlo per il tuo caso d'uso specifico.
Non dovresti veramente aver bisogno di * modello * metaprogrammazione; D ha una valutazione della funzione in fase di compilazione. – Mehrdad
@ Mehrdad per tutto? puoi fare find_if o trasformare i parametri del modello? –
Non per tutto (ci sono ancora bug da correggere), ma per un sacco di cose. È difficile dare una risposta generica, ma se si dispone di un particolare esempio, si prega di postarlo e vedrò se riesco a trovare una versione CTFE e mostrarlo. – Mehrdad