O operador xlate de D é usado para realizar uma tradução de uma expressão de entrada para uma das estruturas de saída de tradução definidas. O operador xlate é usado em uma expressão no formato:
xlate < output-type > ( input-expression )
Por exemplo, para chamar o tradutor hipotético das structs FILE definidas acima e acessar o membro file_fd, você escreveria a expressão:
xlate <struct file_info *>(f)->file_fd;
onde f é uma variável de D do tipo FILE *. À própria expressão xlate é atribuído o tipo definido pelo tipo de saída. Ao ser definido, um tradutor pode ser usado para traduzir expressões de entrada para o tipo de struct da saída do tradutor, ou para um ponteiro para essa struct.
Se você traduzir uma expressão de entrada para uma struct, poderá cancelar a referência de um membro específico da saída imediatamente usando operador “. ”, ou pode atribuir a struct traduzida inteira para outra variável de D a fim de fazer uma cópia dos valores de todos os membros. Se você cancelar a referência de um único membro, o compilador de D irá gerar somente o código correspondente à expressão desse membro. Você não pode aplicar o operador & a uma struct traduzida para obter seu endereço, já que o próprio objeto de dados não existe até que seja copiado ou que um dos seus membros seja referenciado.
Se você traduzir uma expressão de entrada em um ponteiro para uma struct, poderá cancelar a referência de um membro específico da saída imediatamente usando operador ->, ou poderá cancelar a referência do ponteiro usando o operador unário *, nesse caso, o resultado se comportará como se você traduzisse a expressão em uma struct. Se você cancelar a referência de um único membro, o compilador de D irá gerar somente o código correspondente à expressão desse membro. Você não pode atribuir um ponteiro traduzido para outra variável de D, já que o próprio objeto de dados não existe até que seja copiado ou um dos seus membros seja referenciado e, portanto, não pode ser endereçado.
Uma declaração do tradutor não pode omitir expressões de um ou mais membros do tipo de saída. Se uma expressão xlate for usada para acessar um membro para o qual não haja expressão de tradução definida, o compilador de D produzirá uma mensagem de erro apropriada e anulará a compilação do programa. Se o tipo de saída inteiro for copiado através de uma atribuição de estrutura, quaisquer membros para os quais não há expressões de tradução definidas serão preenchidos com zeros.
Para localizar um tradutor correspondente em uma operação xlate, o compilador de D examina o conjunto de tradutores disponíveis na seguinte ordem:
Primeiro, o compilador procura uma tradução do tipo de expressão de entrada exato para o tipo de saída exato.
Segundo, o compilador resolve os tipos de entrada e de saída, seguindo os alias typedef para os nomes de tipo subjacentes e, em seguida, procura uma tradução do tipo de entrada resolvido para o tipo de saída resolvido.
Terceiro, o compilador procura uma tradução de um tipo de entrada compatível para o tipo de saída resolvido. O compilador usa as mesmas regras utilizadas para determinar a compatibilidade dos argumentos de chamada de função com os protótipos de função a fim de determinar se um tipo de expressão de entrada é compatível com um tipo de entrada do tradutor.
Se nenhum tradutor correspondente for encontrado de acordo com essas regras, o compilador de D produzirá uma mensagem de erro apropriada e a compilação do programa falhará.