如何在 ada 中打印通用类型?

How to print a generic type in ada?

我目前正在尝试打印 ("Ada.Text_IO.Put") 通用类型,但这总是失败并出现如下错误:

missing argument for parameter "Item" in call to "Put" declared at a-tiinio.ads:60, instance at a-inteio.ads:18
expected type "Standard.Integer"
found private type "My_Type" defined at testtype.ads:2

这些错误是有道理的,但我不知道如何打印我的值。 以下几行显示了我的通用类型。

generic
    type My_Type is private;
    with function "+"(Left: My_Type; Right: My_Type) return My_Type;

package TestType is
    ...
end TestType;

感谢您的帮助!

您可以要求另一个通用参数,例如:

with function image(Item : in My_Type) return String;

然后简单地打印Image函数输出的字符串。

实际参数的示例可能是:

image => Integer'Image

泛型的意义在于 "it" 适用于任何类型,而 Text_IO 的意义在于它适用于调用其子程序时已知的类型,即字符串,您需要其他泛型用于打印任何类型。因此,要么传递一个从您的类型转换为 String 的特殊函数,如 所回答。或者,将通用正式包与 My_Type 一起传递以进行打印。例如。

generic
    type Any_Type is private;
package Any_Type_IO is
    procedure Put (Item : Any_Type);
    procedure Get (Item : out Any_Type);
end Any_Type_IO;

with Any_Type_IO;
generic
    type My_Type is private;
    with function "+"(Left: My_Type; Right: My_Type) return My_Type;
    with package Printer is new Any_Type_Io (Any_Type => My_Type);
package TestType is
    procedure Run_Test;
end TestType;

因此,随着类型成为 TestType 的通用实际类型,将有一个包成为 TestType 的通用实际包。他们匹配。在 TestType 的实例中,您可以将它们一起使用。

type T is range 1 .. 10;
package T_IO is new Any_Type_IO (T);

package My_Test_Instance is new TestType
  (My_Type => T,
   "+"     => "+",
   Printer => T_IO);

如果您提供了一个打印包,例如 Any_Type_IO,那么打印在两种意义上都变成了通用的:它是任何匹配的打印包的工作,而且它还必须匹配 Ada 意义上的通用正式包.