如何声明带Order参数的泛型包,实例化后生成不同枚举索引数组?
问题
现有如下枚举类型:
type ABC is (A, B, C); type BAC is (B, A, C); type CBA is (C, B, A);
能否声明一个以Order为参数的泛型包:
generic type Order is ... package Pkg type Value_Type is ... type Value_Type_Array is array (Order) of Value_Type; end Pkg;
使得该泛型包实例化后,能得到三种不同的数组类型:
AA : Package_ABC.Value_Type_Array; BB : Package_BAC.Value_Type_Array; CC : Package_CBA.Value_Type_Array;
补充说明:希望能直接使用枚举值对实例化后的数组赋值,假设X、Y、Z为Value_Type类型变量,示例如下:
begin AA (A) := X; AA (B) := Y; AA (C) := Z; ... BB (B) := X; BB (A) := Y; BB (C) := Z; ... CC (C) := X; CC (B) := Y; CC (A) := Z; ... end;
回答
当然可以实现,具体方案如下:
泛型包的正确声明
将Order声明为任意离散类型(枚举类型属于离散类型范畴),Value_Type可根据业务需求定义为具体类型(这里以整数为例):
generic type Order is (<>); -- 接受任意离散类型,适配枚举类型需求 package Pkg is type Value_Type is new Integer; -- 可替换为自定义类型、浮点型等 type Value_Type_Array is array (Order) of Value_Type; end Pkg;
实例化泛型包
针对三个枚举类型分别实例化,生成独立的包及对应类型:
package Package_ABC is new Pkg(Order => ABC); package Package_BAC is new Pkg(Order => BAC); package Package_CBA is new Pkg(Order => CBA);
赋值使用示例
按照需求直接用枚举值作为数组下标赋值,完全符合预期:
declare X, Y, Z : Package_ABC.Value_Type := 1, 2, 3; AA : Package_ABC.Value_Type_Array; BB : Package_BAC.Value_Type_Array; CC : Package_CBA.Value_Type_Array; begin AA (A) := X; AA (B) := Y; AA (C) := Z; BB (B) := X; BB (A) := Y; BB (C) := Z; CC (C) := X; CC (B) := Y; CC (A) := Z; end;
关键细节说明
type Order is (<>)是Ada中声明离散类型泛型参数的标准语法,完美适配枚举类型的传入需求。- 每个实例化后的包会生成独立的
Value_Type和Value_Type_Array类型,满足三种不同数组类型的要求。 - 实例化时传入的枚举类型直接决定了数组的下标范围,因此可以直接用对应枚举值作为下标进行赋值操作。
内容的提问来源于stack exchange,提问作者Marek Kuziel
相关产品推荐
相关产品推荐

