W D, w przeważającej części, meta-programowanie to tylko programowanie. Nie ma potrzeby korzystania z biblioteki takiej jak boost.mpl
Weźmy na przykład długość, którą trzeba przejść do C++, aby posortować tablicę liczb podczas kompilacji. D, po prostu zrobić to oczywistą rzeczą: użyj std.algorithm.sort
import std.algorithm;
int[] sorted(int[] xs)
{
int[] ys = xs.dup;
sort(ys);
return ys;
}
pragma(msg, sorted([2, 1, 3]));
ten wypisuje [1, 2, 3]
w czasie kompilacji. Uwaga: sort
nie jest wbudowany w język i nie ma absolutnie żadnego specjalnego kodu do pracy w czasie kompilacji.
Oto kolejny przykład, który tworzy tabelę odnośników dla sekwencji Fibonacciego podczas kompilacji.
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();
Tutaj fibLUT
jest wykonana w całości w czasie kompilacji, ponownie bez specjalnej kompilacji kodu czasu potrzebnego.
Jeśli chcesz pracować z typami, istnieje kilka typów funkcji meta w std.typetuple
. Na przykład:
static assert(is(Filter!(isUnsigned, int, byte, ubyte, dstring, dchar, uint, ulong) ==
TypeTuple!(ubyte, uint, ulong)));
Ta biblioteka, jak sądzę, zawiera większość funkcji, które można uzyskać z Fusion. Pamiętaj jednak, że naprawdę nie musisz używać wielu szablonów meta-programowania w D tak bardzo jak w C++, ponieważ większość języka jest dostępna w czasie kompilacji.
Nie mogę naprawdę wypowiedzieć się na temat występu, ponieważ nie mam dużego doświadczenia z obydwoma. Jednak moim instynktem byłoby to, że wykonanie kompilacji D's jest szybsze, ponieważ generalnie nie ma potrzeby tworzenia instancji wielu szablonów. Oczywiście kompilatory C++ są bardziej dojrzałe, więc mógłbym się mylić. Jedynym sposobem, który naprawdę się dowiesz, jest wypróbowanie go w konkretnym przypadku użycia.
Nie powinieneś naprawdę potrzebować * szablonu * metaprogramowania; D ma funkcję oceny czasu kompilacji. – Mehrdad
@Mehrdad na wszystko? możesz zrobić find_if lub przekształcić parametry szablonu? –
Nie na wszystko (są jeszcze błędy do naprawienia), ale na wiele rzeczy. Trudno podać ogólną odpowiedź, ale jeśli masz konkretny przykład, opublikuj go, a zobaczę, czy uda mi się znaleźć jego wersję CTFE i pokazać. – Mehrdad