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

generic object parameters are never considered static, how to use generic in mode object parameter then?

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

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

但都是一样的

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

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

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