D 运算符 xlate 用于执行从输入表达式到所定义的某种转换输出结构的转换。xlate 运算符用于以下格式的表达式:
xlate < output-type > ( input-expression )
例如,要对上面定义的 FILE 结构调用假设的转换器并访问 file_fd 成员,可以编写以下表达式:
xlate <struct file_info *>(f)->file_fd;
其中,f 是 FILE * 类型的 D 变量。为 xlate 表达式本身指定 output-type 定义的类型。定义转换器之后,可以使用该转换器将输入表达式转换为转换器输出结构类型或指向该结构的指针。
如果将输入表达式转换为结构,则可以使用 "." 运算符立即取消引用输出的特定成员,或者可以将整个已转换的结构赋给另一个 D 变量,以创建一份所有成员的值的副本。如果取消引用单个成员,则 D 编译器将仅生成对应于该成员的表达式的代码。不可以将 & 运算符应用于已转换的结构来获取其地址,因为在复制数据对象本身或引用它的某个成员之前,数据对象本身不存在。
如果将输入表达式转换为指向某结构的指针,则可以使用 -> 运算符立即取消引用输出的特定成员,或者可以使用一元 * 运算符取消引用该指针,在此情况下,产生的结果就像已经将表达式转换为结构一样。如果取消引用单个成员,则 D 编译器将仅生成对应于该成员的表达式的代码。不可以将已转换的指针赋给另一个 D 变量,因为在复制对象或引用它的某个成员之前,数据对象本身不存在,所以无法对其寻址。
转换器声明可以省略输出类型的一个或多个成员的表达式。如果使用 xlate 表达式访问未定义转换表达式的成员,则 D 编译器将产生相应的错误消息,并中止程序编译。如果通过结构赋值的方式复制整个输出类型,则将使用零填充未定义转换表达式的任何成员。
为了找到 xlate 操作的匹配转换器,D 编译器将按以下顺序检查可用的转换器集:
首先,编译器查找从确切的输入表达式类型到确切的输出类型的转换。
其次,编译器将解析任何 typedef 别名后面的输入和输出类型为基础类型名称,然后查找从已解析的输入类型到已解析的输出类型的转换。
再次,编译器将查找从兼容的输入类型到已解析的输出类型的转换。为了确定输入表达式类型是否与转换器的输入类型兼容,编译器将使用确定函数调用参数是否与函数原型兼容的相同规则。
如果根据这些规则,未找到匹配的转换器,D 编译器将产生相应的错误消息,并且程序编译失败。