泛型对象参数永远不会被认为是静态的,如何在模式对象参数中使用泛型呢?

时间:2018-04-07 12:45:17

标签: generics ada

我在模式参数“Hexa_identifier”中有一个泛型对象,字符类型,我想在泛型单元的主体中的case语句中使用它。 似乎我不能,因为通用对象参数永远不会被认为是静态的(RM 4.9(5)),这似乎使得通用(在模式中)对象参数非常无用。 我试过这个:

Hexa_identifier_character : constant CHARACTER := hexa_identifier -- <- generic parameter
     when Hexa_Identifier_CHARACTER =>

但它是一样的。

1 个答案:

答案 0 :(得分:3)

由于多种原因,通用对象参数从不被视为静态。一种是这样,编译器只能为通用单元发出一次目标代码,使对象参数成为内部指针值。另一个是您可以在子程序中实例化通用单元,使用这些子程序的参数作为通用对象参数的实际值,这使得它们事实上是非静态的。

这并不意味着它们毫无用处。你不能在case语句中使用它们或者用于任何其他需要静态值的目的,但你当然可以像任何非静态值一样使用它们。例如,您可以将case语句转换为if级联。这将不允许在编译器中进行与case语句相同的优化级别,但由于Ada中定义泛型的方式,该级别无论如何都不可能。

修改:如果您想拥有真正的静态参数,请不要使用泛型。使用代码生成器将代码中的占位符替换为实际值。如果你正在使用GPRBuild,This Ada Gem有一些指示。这种方法允许您为每个实例化生成代码,基本上将您的“通用”代码放在与C ++模板相同的级别上。