Тип преобразования в Ада - PullRequest
3 голосов
/ 09 апреля 2011

У меня есть пакет, в котором я преобразую строку в целое число с этим:

param: integer;
begin
param:= Integer'Value(param_string);

Мой вопрос очень прост, я хотел бы сделать то же самое, но с общим пакетом. Универсальным типом является TypeElement. Однако я не могу сделать это:

param: TypeElement;
begin
param:= TypeElement'Value(param_string);

Ошибка: префикс атрибута «значение» должен быть скалярного типа »

Есть трюк?

1 Ответ

3 голосов
/ 09 апреля 2011

Общий формальный тип, который вы предоставляете для TypeElement, должен представлять скалярный тип.

Если вы объявляете это как частное, например ::100100

generic
   type TypeElement is private;

тогда это не сработает, потому что нет гарантии, что TypeElement будет скалярным типом, который, как вы обнаружили, должен использовать атрибут 'Value. Вам необходимо использовать одно из общих представлений формальных типов для дискретных типов, как указано в Ada LRM 12.5.2 .

Например:

generic

   type Type_Element_Discrete is (<>);
   type Type_Element_Signed_Int is range <>;
   type Type_Element_Mod is mod <>;
   type Type_Element_Digits is digits <>;
   type Type_Element_Delta is delta <>;
   type Type_Element_Delta_Digits is delta <> digits <>;

package Gen_Convert is

   function Gen_Convert (Param_String : String) return Type_Element_Discrete;
   function Gen_Convert (Param_String : String) return Type_Element_Signed_Int;
   function Gen_Convert (Param_String : String) return Type_Element_Mod;
   function Gen_Convert (Param_String : String) return Type_Element_Digits;
   function Gen_Convert (Param_String : String) return Type_Element_Delta;
   function Gen_Convert (Param_String : String) return Type_Element_Delta_Digits;

end Gen_Convert;

Указание соответствующего формального типа также гарантирует, что экземпляр универсального шаблона предоставляет допустимый тип. Вот соответствующее тело, демонстрирующее конверсию значений:

package body Gen_Convert is

   function Gen_Convert (Param_String : String) return Type_Element_Discrete is
   begin
      return Type_Element_Discrete'Value(Param_String);
   end Gen_Convert;

   function Gen_Convert (Param_String : String) return Type_Element_Signed_Int is
   begin
      return Type_Element_Signed_Int'Value(Param_String);
   end Gen_Convert;

   function Gen_Convert (Param_String : String) return Type_Element_Mod is
   begin
      return Type_Element_Mod'Value(Param_String);
   end Gen_Convert;

   function Gen_Convert (Param_String : String) return Type_Element_Digits is
   begin
      return Type_Element_Digits'Value(Param_String);
   end Gen_Convert;

   function Gen_Convert (Param_String : String) return Type_Element_Delta is
   begin
      return Type_Element_Delta'Value(Param_String);
   end Gen_Convert;

   function Gen_Convert (Param_String : String) return Type_Element_Delta_Digits is
   begin
      return Type_Element_Delta_Digits'Value(Param_String);
   end Gen_Convert;

end Gen_Convert;
...