Это действительно неприятная проблема. У меня есть тип записи, который охватывает различные базовые типы, и теперь мне нужно, чтобы он мог хранить вектор (из Ada.Containers.Vectors) в себе! Я думаю, это невозможно, но может ли кто-нибудь дать мне совет, как решить эту проблему по-другому? Чтобы дать вам лучшее представление о том, чем я занимаюсь, вот что не работает:
with Base_Types; use Base_Types;
with Ada.Strings.Wide_Unbounded; use Ada.Strings.Wide_Unbounded;
with Ada.Containers.Vectors;
with Green_Tasks; use Green_Tasks;
with Ada.Unchecked_Deallocation;
package Boxed_Types is
type String_Ptr is access Unbounded_Wide_String;
procedure Free_Unbounded_Wide_String is new Ada.Unchecked_Deallocation
(Object => Unbounded_Wide_String, Name => String_Ptr);
type Vector_Ptr; -- this won't work
type Type_T is (T_Null, T_UInt64, T_Text, T_Bool, T_GTask, T_Vector);
type Item (IType : Type_T := T_Null) is record
case IType is
when T_Null => null;
when T_UInt64 => UInt64 : UInteger_64;
when T_Text => String : String_Ptr;
when T_Bool => Bool : Boolean;
when T_GTask => Green_Task : Green_Task_Ptr;
when T_Vector => Item_Vector : Vector_Ptr; -- error here
end case;
end record;
package Item_Vectors is new Ada.Containers.Vectors
(Index_Type => Natural,
Element_Type => Item);
use Item_Vectors;
type Vector_Ptr is access Vector;
end Boxed_Types;
Это дает мне не столь неожиданную ошибку "недопустимое использование типа до его полного объявления" для Vector_Ptr. Однако я не могу создать экземпляр векторного пакета до того, как объявлю Item, и мне действительно нужен вектор и базовые типы, заключенные в один тип записи. (Это для интерпретатора, который я пишу в свободное время; виртуальная машина должна хранить различные типы в стеке, в гетерогенных массивах, манипулировать ими и т. д..)
Придется ли мне полностью нарушать безопасность типов и возиться с адресом для доступа к конверсиям или есть более чистое решение?