Саймон дал лучший, более полный ответ. Я просто предоставляю альтернативу, в которой пакет карты передается в качестве формального параметра. Для этого вы можете передать пакет как формальный параметр, если его параметры также отправлены как формальные параметры:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Containers.Ordered_Maps;
procedure Hello is
generic
type Key_Type is private;
type Element_Type is private;
with function "<"(L,R : Key_Type) return Boolean is <>;
with function "="(L,R : Key_Type) return Boolean is <>;
with package Map_Package is new Ada.Containers.Ordered_Maps
(Key_Type => Key_Type,
Element_Type => Element_Type,
"<" => "<",
"=" => "=");
function Create_Map_Generic return Map_Package.Map;
function Create_Map_Generic return Map_Package.Map is
begin
return Result : Map_Package.Map do
null; -- replace with your input based creation
end return;
end Create_Map_Generic;
-- Just a nonsense type to test out compilation
type My_Key is null record;
function "<"(L,R : My_Key) return Boolean is (True);
function "="(L,R : My_Key) return Boolean is (True);
package Maps is new Ada.Containers.Ordered_Maps
(Key_Type => My_Key,
Element_Type => Integer);
function Create is new Create_Map_Generic
(Key_Type => My_Key,
Element_Type => Integer,
Map_Package => Maps);
begin
Put_Line("Hello, world!");
end Hello;
В качестве дополнительного дополнительного лакомого кусочка, ЕСЛИ вам все равно, какой ключ и типы элементов находятся внутри функции (я думаю, что вы делаете, но только в случае), тогда вам не нужно указывать их и можете просто сделать:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Containers.Ordered_Maps;
procedure Hello is
generic
with package Map_Package is new Ada.Containers.Ordered_Maps
(others => <>);
function Create_Map_Generic return Map_Package.Map;
function Create_Map_Generic return Map_Package.Map is
begin
return Result : Map_Package.Map do
null; -- replace with your input based creation
end return;
end Create_Map_Generic;
-- Just a nonsense type to test out compilation
type My_Key is null record;
function "<"(L,R : My_Key) return Boolean is (True);
function "="(L,R : My_Key) return Boolean is (True);
package Maps is new Ada.Containers.Ordered_Maps
(Key_Type => My_Key,
Element_Type => Integer);
function Create is new Create_Map_Generic
(Map_Package => Maps);
begin
Put_Line("Hello, world!");
end Hello;
Вы также можете пойти на компромисс в середине, в зависимости от того, что Вы хотите использовать в своей функции создания:
generic
type Key_Type is private;
type Element_Type is private;
with package Map_Package is new Ada.Containers.Ordered_Maps
(Key_Type => Key_Type,
Element_Type => Element_Type,
others => <>);
function Create_Map_Generic return Map_Package.Map;