我有一个程序包,其中使用以下代码将字符串转换为整数:
param: integer;
begin
param:= Integer'Value(param_string);
我的问题很简单,我想做同样的事情,但使用通用包。通用类型是TypeElement。然而,我无法这么做:
param: TypeElement;
begin
param:= TypeElement'Value(param_string);
错误是“value属性的前缀必须是标量类型”。 有什么窍门吗?
我有一个程序包,其中使用以下代码将字符串转换为整数:
param: integer;
begin
param:= Integer'Value(param_string);
我的问题很简单,我想做同样的事情,但使用通用包。通用类型是TypeElement。然而,我无法这么做:
param: TypeElement;
begin
param:= TypeElement'Value(param_string);
您提供给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;
with Value_Of(T : TypeElement) return Integer
。(时间不够修改评论。) - Marc C