Ada 枚举值

Ada Enums to Values

我可以用另一种方式处理这个问题,虽然不是很干净,但希望能够利用以下内容:

type Prefix is (Yocto, Zepto, Atto, Femto, Pico, Nano,
    Micro, Milli, Centi, Deci, None, Deca, Hecto, Kilo,
    Mega, Giga, Tera, Peta, Exa, Zetta, Yotta);
for Prefix use (
    Yocto => -24,
    Zepto => -21,
    Atto => -18,
    Femto => -15,
    Pico => -12,
    Nano => -9,
    Micro => -6,
    Milli => -3,
    Centi => -2,
    Deci => -1,
    None => 0,
    Deca => 1,
    Hecto => 2,
    Kilo => 3,
    Mega => 6,
    Giga => 9,
    Tera => 12,
    Peta => 15,
    Exa => 18,
    Zetta => 21,
    Yotta => 24);

GNAT 没有抱怨表示条款。但是,我似乎无法真正获取值,因为据我所知,与此相关的唯一属性与位置有关,而不是分配值。

如果实现定义的属性是可接受的,GNAT 会提供两个在此上下文中有用的属性:

  • Enum_Rep,其中 "returns the representation value for the given enumeration value."

  • Enum_Val,其中 "returns the enumeration value whose representation matches the argument."

表示子句用于设置类型存储在内存中的内部值。如果您想以标准方式将此值作为整数获取,您应该对 Unchecked_Conversion 函数进行实例化。

with Ada.Unchecked_Conversion;
{...}

for Prefix'Size use Integer'Size;

function Value_of is new
   Ada.Unchecked_Conversion (Prefix, Integer);

枚举从未用于此类目的,您不应尝试将它们用于此目的。 (我认为主要目的是在某些外部表示或硬件寄存器或其他东西中定义具有 0、1 以外的值的枚举。)但是,您实际上可以在保持代码几乎相同的同时解决此问题:

type Prefix is (Yocto, Zepto, Atto, Femto, Pico, Nano,
    Micro, Milli, Centi, Deci, None, Deca, Hecto, Kilo,
    Mega, Giga, Tera, Peta, Exa, Zetta, Yotta);
type Prefix_To_Integer_Map is array (Prefix) of Integer;
Power_of_Ten : constant Prefix_To_Integer_Map := (
    Yocto => -24,
    Zepto => -21,
    Atto => -18,
    Femto => -15,
    Pico => -12,
    Nano => -9,
    Micro => -6,
    Milli => -3,
    Centi => -2,
    Deci => -1,
    None => 0,
    Deca => 1,
    Hecto => 2,
    Kilo => 3,
    Mega => 6,
    Giga => 9,
    Tera => 12,
    Peta => 15,
    Exa => 18,
    Zetta => 21,
    Yotta => 24);

应该和您拥有的一样干净。并且说 Power_Of_Ten (My_Prefix)My_Prefix'Enum_RepPrefix'Enum_Rep(My_Prefix) 或其他任何东西更具描述性。