【问题标题】:In Ada generic packages在 Ada 通用包中
【发布时间】:2016-11-22 17:41:09
【问题描述】:

在 Ada Generic 包中,如果我有一个包可以处理您放入的任何元素,如果我想证明该包正在工作,我是否必须运行两个单独的客户端程序来显示 Integer 和 Float,或者我可以在同一个程序中完成所有这些吗?

【问题讨论】:

  • 您可以在单个程序中多次实例化一个泛型包,使用不同的泛型参数,例如不同的类型。每个都有自己的名字,所以应该没有歧义。
  • 但是假设我有 Ada.Integer_Text_IO;通过整个程序,如何将其固定为整数或浮点数
  • Ada.Float_Text_IO 会浮动。你可以“与”两者。然后 Put(2.0) 调用一个函数,而 Put(2) 调用另一个函数。
  • 我必须使用完整的库名
  • Ada.Integer_Text_IO 或 Ada.FLoat_Text_IO;

标签: generics packages ada


【解决方案1】:

泛型参数应该包括一个泛型过程参数,用于打印传递给包的泛型数据类型。这将允许数据类型为任何类型,通用包的编写者无需关心它是如何输出的。

generic
   type element_type is private;
   with procedure Print(Item : element_type);
package gen_pack is
   ...
end gen_pack;

【讨论】:

    【解决方案2】:

    IIUC,“内部”包也是依赖于外部包的通用形式类型的包,至少就测试而言。那么有两种情况。

    1. 如果内包是普通包,比如Integer_Text_IO,只能处理singed integer类型,这是编译时的事情。

    2. 内包是一种可以通过实例化得到的类型,使用外泛包的泛型形式类型。

    在第一种情况下,编译器只能拒绝,因为Integer_Text_IO 不是为浮点操作数创建的。所以你必须设置单独的测试用例。

    在第二种情况下,结果取决于“内部实例”。由于编译器在给定类型时无法创建泛型包,因此它只能实例化存在的泛型包。后者必须具有匹配的形式要求。也就是说,外部泛型和要实例化的内部泛型的泛型形式类型必须匹配:它们不能来自互斥的类别,例如range <>digits <>

    有时,值得考虑的是,可以通过将“内部泛型”作为外部泛型的形式参数来指定对“内部泛型”的要求:

    generic
        type X (<>) is limited private;
    package Taking_Any is
        -- ... operations for both FPT and integer types
    end Taking_Any;
    
    generic
        type T is private;
        with package Works_With_Any is new Taking_Any (<>);
    package Outer is
        package Any_Instance is new Taking_Any (T);
    end Outer;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多