Generics 泛型函数返回映射

Generics 泛型函数返回映射,generics,ada,Generics,Ada,在以下示例中,函数创建并返回有序映射: 与Ada.Containers.Ordered_映射; 使用Ada.Strings.Unbounded;使用Ada.Strings.Unbounded; 主要程序是 包My_Map是新的Ada.Containers.Ordered_Maps (按键类型=>自然, 元素类型=>无界字符串); 函数Create_Map返回My_Map.Map为 Map\u实例:My\u Map.Map; 开始 Map_Instance.Insert(1,到_无界_字符串(“F

在以下示例中,函数创建并返回有序映射:

与Ada.Containers.Ordered_映射;
使用Ada.Strings.Unbounded;使用Ada.Strings.Unbounded;
主要程序是
包My_Map是新的Ada.Containers.Ordered_Maps
(按键类型=>自然,
元素类型=>无界字符串);
函数Create_Map返回My_Map.Map为
Map\u实例:My\u Map.Map;
开始
Map_Instance.Insert(1,到_无界_字符串(“Foo”);
映射Instance.Insert(2,到无界字符串(“Bar”);
返回Map_实例;
结束创建地图;
开始
无效的
端干管;
我想知道是否可以将函数
Create\u Map
转换为更通用的函数?下面的代码显示了我的想法,但不幸的是,我真的不知道正确的形式类型

通用
类型键_类型为???;
类型元素_类型为???;
类型映射_类型为???;
函数Create\u Map\u通用返回映射类型为
Map\u实例:Map\u类型;
开始
--插入调用将基于分析数据。。。
返回Map_实例;
结束;
包My_Map_One是新的Ada.Containers.Ordered_Maps
(按键类型=>自然,
元素类型=>无界字符串);
函数Create\u Map\u One是新的Create\u Map\u Generic
(按键类型=>自然,
元素类型=>无界字符串,
Map\u Type=>My\u Map\u One.Map);
包My_Map_Two是新的Ada.Containers.Ordered_Maps
(键类型=>无界字符串,
元素类型=>正);
函数Create\u Map\u Two是新的Create\u Map\u Generic
(键类型=>无界字符串,
元素类型=>正,
Map\u Type=>My\u Map\u Two.Map);

形式类型
Key\u Type
Element\u Type
指定了两次(包声明和泛型函数的实例化)。这些可以从包本身的声明中提取出来吗?

我不确定这是否符合您的用例,但接下来

我不认为仅仅用一个泛型函数就可以做到这一点;我认为最好是作为一个通用包(声明映射,从
正数
无界字符串
),包含一个通用函数,使用特定的填充子程序创建映射

外部通用:

与Ada.Containers.Ordered_映射;
通用的
类型Key_类型为private;
类型元素\u类型是私有的;
函数为“”
&To_字符串(P_To_UBS_Maps.Maps.Element(J));
端环;
结束试验;
构建和运行:

$gnatmake测试-f-g
gcc-c-g test.adb
gcc-c-g地图
gnatbind-x-test.ali
gnatlinktest.ali-g
gnatlink:警告:可执行文件名“test”可能与shell命令冲突
美元/测试
1->1
答案是什么


这样一来,直接调用
Populate
似乎没有什么真正的优势。

Simon给出了更好更完整的答案。我只是提供了一种替代方法,将map包作为形式参数传入。为此,您可以将包作为形式参数传递,只要其参数也作为形式参数发送:

带有Ada.Text\u IO;使用Ada.Text\u IO;
使用Ada.Containers.Ordered_映射;
你好
通用的
类型Key_类型为private;
类型元素\u类型是私有的;

使用函数“这可能是可能的,但恐怕我不明白为什么您希望避免代码重复。在我的程序中,这些映射是从解析的输入文件填充的,但类型根据输入文件的类型而不同。目前,我多次复制解析代码。实际上,当您将
与包P一起使用时,是新的G(others=>);
语法,您可以引用P的通用形式来访问用于实例化为P提供的包的实际参数:`Key:P.Key_Type;”。