使用通用包

Fla*_*eat 2 ada

我的问题很简单.我有2个通用包.我使用每个包2次(一次用于整数和字符串一次).我有一个"主"文件,使用用户选择的包. - package1 with integer - 或package1 with string - 或package2 with integer - 或package2 with string

procedure main is
     package aB is new package1(integer, false, afficheInteger, true);
    --package aB is new package1(Unbounded_String, true, afficheUnbounded, true);
    --package aB is new package2(1,integer, false, afficheInteger, true);
    --package aB is new package2(1, Unbounded_String, true, afficheUnbounded, true);
Run Code Online (Sandbox Code Playgroud)

开始aB.init(); .....

目标是为4个包使用相同的代码(main).

不幸的是我找不到如何正确地做到这一点.目前我把包裹列表和我评论我不使用的包裹.是否有可能在开始时生成伪if或在begin中初始化包?也许在main函数中有一个package参数?

非常感谢,对不起我的英语!

更新:

是否可以在函数中传递包参数?像这样 :

procedure init_paquetage1_int is
    package aB is new packA(integer, false, afficheInteger, true);
begin
    main(aB);
end init_paquetage1_int; 

procedure main(aB : packA) is
begin
    aB.init();
    ....
end main;
Run Code Online (Sandbox Code Playgroud)

它不起作用.

T.E*_*.D. 6

好.首先,我没有看到任何方式你希望这个工作,除非你在包中调用的例程具有相同的参数配置文件,无论使用哪种类型.通常,通用包将至少有一个例程,它使用您在例程的参数中实例化的类型之一(或作为返回类型).

如果你想要使用的例程实际上具有相同的配置文件,我可以想到你可以做的一些事情.第一种是使用指向要调用的例程的指针,并将其传入.

   type Init_Routine is access procedure ();
begin
   main (ab.Init'access);
Run Code Online (Sandbox Code Playgroud)

第二种方法是使您的通用包都包含从公共父标记类型派生的abstract标记类型,该标记类型具有您要调用的abstract例程,在父级中定义为例程.如果这样做,您可以使用动态分派在运行时在它们之间进行选择.

package Parent is
   type Instance is abstract tagged null record;
   type Dispatching_Instance_Ptr is access all Instance;
   procedure Init (I : in out Instance) is abstract;
end Parent;

generic 
   --// Whatever your generic parameters are...
Package1 is
    type Instance is new Parent.Instance with null record;
    procedure Init (I : in out Instance);
    ...
end Package1;
--// (Package2 looks similar)
Run Code Online (Sandbox Code Playgroud)

跳到调用代码:

    Choice : Parent.Dispatching_Instance_Ptr;
begin
    --// Let's assume the user "chooses" package aB
    Choice := new'aB.Instance;
    main (Choice);
Run Code Online (Sandbox Code Playgroud)

...和主要:

procedure main(xx : in Parent.Dispatching_Instance_Ptr) is
begin
   Parent.Init(xx.all);  --// This should dynamic dispatch to the proper init routine
   ....
end main;
Run Code Online (Sandbox Code Playgroud)

注意:我没有通过编译器运行它,因此可能存在小问题.我已经发现并修复了一对.