2011-04-09 53 views
3

我有一個包,我一個字符串轉換爲整數,這樣的:類型轉換在ADA

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

我的問題是verysimple,我願做同樣的事情,但有一個通用的軟件包。泛型類型是TypeElement。但是我不能做到這一點:

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

的錯誤是「‘值’屬性的前綴必須是標量型」

有沒有竅門?

回答

3

您爲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; 
+0

非常感謝。但我的問題是TypeElement可以是整數或字符串。我必須將類型設置爲私有才能這樣做,不是嗎? – Flatbeat 2011-04-09 15:32:40

+0

'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

+0

在上面的評論中,我輸錯了建議的Value_Of()函數的返回類型,它應該是:'With Value_Of(T:TypeElement)return Integer'。 (沒有時間編輯註釋。) – 2011-04-09 18:24:20