La CTFE est un mécanisme qui permet au compilateur d'évaluer une fonction au moment de la compilation. Il n'est pas nécessaire de programmer les fonctions différement pour utiliser cette fonctionnalité. Il suffit qu'une fonction prenne en arguments des valeurs connues à la compilations, et le compilateur D peut décider d'interpréter cette fonction à ce moment.
// Le résultat peut être calculé à
// la compilation. Vérifiez l'assembleur
// généré, il ne contiendra pas d'appel
// à la fonction!
static val = sqrt(50);
Les mots clés comme static
, immutable
ou enum
indiquent au compilateur d'utiliser la CTFE dès que c'est possible. Le grand avantage de cette technique est que les fonctions n'ont pas besoin d'être réecrites pour l'utiliser, et le même code peut parfaitement être partagé entre l'interprétation à la compilation et à l'exécution:
int n = faireQqchALexecution();
// Même fonction qu'avant mais
// cette fois, juste appelée à
// l'exécution
auto val = sqrt(n);
Un exemple parfait en D est la librairie std.regex
. Elle fourni un type ctRegex
qui utilises les string mixins et la CTFE pour générer des automates d'expressions régulières ultra optimisés à la compilation. Le même code peut être réutilisé pour l'autre version regex
qui permet de compiler des expressions régulières pendant l'exécution.
auto compileRegex = ctRegex!(`^.*/([^/]+)/?$`);
auto expReg = regex(`^.*/([^/]+)/?$`);
// compileRegex et expReg seront interchangeables
// mais compileRegex sera plus rapide !
Toutes les fonctionnalités du langage ne sont pas disponibles pendant l'évaluation de fonction à la compilation, mais l'ensemble des fonctionnalités supportées grandit à chaque nouvelle version du compilateur.