L'opérateur D xlate permet de convertir une expression d'entrée en une expression des structures de sortie de conversion définies. L'opérateur xlate est utilisé dans une expression identique à l'exemple suivant :
xlate < output-type > ( input-expression )
Par exemple, pour invoquer un translateur hypothétique pour les structs FILE définies ci-dessus et accéder au membre file_fd, vous devriez utiliser l'expression suivante :
xlate <struct file_info *>(f)->file_fd;
f correspondant à une variable en D du type FILE *. L'expression xlate elle-même se voit attribuer le type défini par output-type. Un translateur, après avoir été défini, permet de convertir des expressions d'entrée en type de struct de sortie du translateur ou en pointeur vers cette struct.
Si vous convertissez une expression d'entrée en struct, vous pouvez soit déréférencer un membre particulier de la sortie immédiatement à l'aide de l'opérateur “.” soit affecter l'intégralité de la struct convertie à une autre variable D pour réaliser une copie des valeurs de tous les membres. S vous déréférencez un seul membre, le compilateur D ne générera que le code correspondant à l'expression de ce membre. Vous ne pouvez pas appliquer l'opérateur & à une struct convertie pour obtenir son adresse étant donné que l'objet de données lui-même n'existe pas tant qu'il n'est pas copié ou qu'un de ses membres n'est pas référencé.
Si vous convertissez une expression d'entrée vers un pointeur en struct, vous pouvez soit déréférencer un membre particulier de la sortie immédiatement à l'aide de l'opérateur ->, soit déréférencer le pointeur à l'aide de l'opérateur unaire *, auquel cas le résultat se comporte comme si vous traduisiez l'expression en une struct. S vous déréférencez un seul membre, le compilateur D ne générera que le code correspondant à l'expression de ce membre. Vous ne pouvez pas affecter de pointeur converti en une autre variable en D étant donné que l'objet de donnée en lui-même n'existe pas tant qu'il n'a pas été copié ou que l'un de ses membres n'a pas été référencé car, de fait, son adressage est impossible.
Une déclaration du translateur peut omettre les expressions d'un ou de plusieurs membres du type de sortie. Si une expression xlate est utilisée pour accéder à un membre pour lequel aucune expression de conversion n'est définie, le compilateur D engendre un message d'erreur approprié et interrompt la compilation du programme. Si l'intégralité du type de sortie est copié au moyen d'une affectation de structure, tous les membres pour lesquels aucune expression de conversion n'a été définie sont remplis de zéros.
Afin de trouver un translateur correspondant à une opération xlate, le compilateur D examine l'ensemble des translateurs disponibles dans l'ordre suivant :
Le compilateur commence par rechercher une conversion du type d'expression d'entrée exact vers le type de sortie exact.
Il résout ensuite les types d'entrée et de sortie en suivant les alias typedef sur les noms de type sous-jacents, puis recherche une conversion du type d'entrée résolu vers le type de sortie résolu.
Enfin, le compilateur recherche une conversion d'un type d'entrée compatible vers un type de sortie résolu. Le compilateur utilise les mêmes règles que celles qui lui permettent de déterminer la compatibilité des arguments d'appel de fonction avec les prototypes de fonction dans le but de déterminer si un type d'expression d'entrée est compatible avec un type d'entrée du translateur.
Si le compilateur D ne trouve aucun translateur conforme à ces règles, il produit un message d'erreur approprié et la compilation du programme échoue.