7.3.3 语义

7.3.3.1 模板

TemplateableElement是一种可以被定义为模板并绑定到其它模板的元素。一个模板是一个使用TemplateSignature(模板签名)来对自身进行参数化的TemplateableElement。这样的一个模板可以使用TemplateBinding(模板绑定)关系来生成其它的模型元素。

模板不能像同类型的非模板元素那样使用(例如,一个模板类不能用于一个类型化元素/TypedElement的类型)。模板元素只能用来生成绑定后的元素或者是另一个模板规约的一部分(例如,一个模板类可以特化另一个模板类)。

模板的模板签名定义了一组TemplateParameters(模板参数),模板参数用于在模板的绑定过程中被绑定到具体的模型元素。一个绑定元素是具有一个或多个模板绑定的TemplateableElement。

一个完全绑定元素指的是它的所有模板绑定绑定了该模板的所有模板参数。一个完全绑定的元素是一个普通元素,可以像同类非绑定(和非模板)元素那样来使用。例如,一个完全绑定的类模板可以用做一个类型化元素的类型。

一个部分绑定元素指的是该模板中至少有一个模板参数没有被绑定到一个模板绑定上。一个部分绑定元素仍然被认为是一个模板,由剩余的未被模板绑定所绑定的模板参数所参数化。

7.3.3.2 模板签名

模板签名中的模板参数规定了在一个绑定中会被实际参数(或缺省参数)所替换的形式参数。模板参数由拥有该模板签名的模板所包含的ParameterableElement(可参数化元素)来定义。这样的一个元素由该模板参数来公开(exposed)。

一个公开的可参数化元素可以被模板所直接或间接地拥有,或者它被模板参数自身所拥有。无论哪种情况,可参数化元素只有在模板的上下文中才有意义——它将在一个绑定的上下文中被一个实际元素所替代。因此,由模板参数所公开的可参数化元素不能被拥有它的模板的外部世界或可以访问该模板内部的其它模板(例如,当模板被特化时)来访问。模板签名的子类还可以增加额外的规则来约束在某个特定类型的模板上下文中哪些类型的可参数化元素可以用于一个模板参数。

一个模板参数还可以引用一个可参数化元素作为该形式参数的缺省参数,用于在模板绑定中没有为该参数提供显式的TemplateParameterSubstitution(模板参数替换)时来使用。与一个公开的可参数化元素类似,一个缺省的可参数化元素可以被该模板直接拥有或者是被该模板参数自身所拥有。即使在公开的参数化元素没有被该模板参数所拥有的情况下,模板参数依然可以拥有该缺省的可参数化元素。

7.3.3.3 模板绑定

元素绑定是一个TemplateableElement和一个模板直接的关系,它规定了实际可参数化元素如何替换模板中的形式模板参数。一个模板参数替换规定了在一个模板绑定上下文中用于替换形式模板参数的实际参数。如果在该绑定中没有为某个形式参数指定实际参数,那么使用该形式模板参数的缺省可参数化元素(如果指定了的话)。

一个绑定元素可以有多个绑定。此外,绑定元素可以包含绑定之外的其它元素。多个绑定的扩展(expansions)细节和绑定元素拥有的其它元素联合起来规定了该绑定元素,这是与TemplateableElement的特定子类相关的。一般性原则是对不同的绑定单独做计算产生中间结果,然后把它们合并生成最终结果。合并方法由特定的TemplateableElement来决定。

TemplateableElement可以既包含一个模板签名,有可以包含模板绑定。因此一个TemplatableElement可以既是一个模板,也可以是一个绑定元素。

遵循本规范的工具可以要求所有的形式模板参数必须在一个模板绑定中被绑定(完全绑定),或者允许形式模板参数的一个子集被绑定(部分绑定)。在完全绑定的情况下,绑定元素可以有自己的模板签名,它的模板参数可以用做该模板绑定中的实际参数。在部分绑定的情况下,未绑定的形式模板参数做为绑定元素的形式模板参数,从而使得它仍然是一个模板。

注意:具有缺省参数的模板参数永远都不会未绑定,因为它有一个隐式的绑定。

results matching ""

    No results matching ""