您爲TypeElement提供的一般形式類型必須表示標量類型。
如果你聲明爲私有,如:
generic
type TypeElement is private;
那麼這不會工作,因爲沒有保證TypeElement將是一個標量型,其中,因爲你已經發現需要使用「值」屬性。您需要爲離散類型使用其中一種通用正式類型表示,如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 2011-04-09 15:32:40
'Value'屬性對Integer無效,因此無法構建將依賴於從TypeElement提取整數值的泛型。 (是的,TypeElement必須是一個私有的正式類型才能接受Integer或String實際類型)。但是,如果泛型也需要一個「Value_Of」函數:「with Value_Of(T:TypeElement)return String」,那麼實例化器將提供TypeElement和一個Value_Of函數(可以使用Value),並且您的泛型包只會調用Value_Of ()從String轉換爲Integer,或者只返回Integer。 – 2011-04-09 18:15:52
在上面的評論中,我輸錯了建議的Value_Of()函數的返回類型,它應該是:'With Value_Of(T:TypeElement)return Integer'。 (沒有時間編輯註釋。) – 2011-04-09 18:24:20