Ada中的类型转换

3

我有一个程序包,其中使用以下代码将字符串转换为整数:

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

我的问题很简单,我想做同样的事情,但使用通用包。通用类型是TypeElement。然而,我无法这么做:

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

错误是“value属性的前缀必须是标量类型”。 有什么窍门吗?
1个回答

3

您提供给TypeElement的通用形式类型必须代表标量类型。

如果您将其声明为私有的,例如:

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;

非常感谢。但我的问题是TypeElement可以是整数或字符串。我必须将类型设置为私有,对吗? - Flatbeat
“Value”属性对于整数类型无效,因此没有办法构建一个通用程序来依赖它从TypeElement中提取整数值。(是的,TypeElement必须是一个私有形式类型,才能接受整数或字符串实际类型)。然而,如果通用程序还需要一个“Value_Of”函数:“with Value_Of(T: TypeElement) return String”,那么实例化程序将提供TypeElement和Value_Of函数(它可以使用'Value),您的通用程序包将只调用Value_Of()将字符串转换为整数,或者直接返回整数。 - Marc C
在上面的评论中,我错误地输入了建议的Value_Of()函数的返回类型,它应该是:with Value_Of(T : TypeElement) return Integer。(时间不够修改评论。) - Marc C
1
值得注意的是,使用“valid”检查您的浮点/定点类型,因为并非所有位模式都是有效的浮点数。 - NWS
通常情况下,除非有人投票支持该评论,否则我会通过将评论文本复制到剪贴板中,删除评论,然后重新提交(带有修复)来解决该问题。 - T.E.D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接