Ada 2012 - 用自定义版本替换 Fixed_Decimal_Type'Round()?

Ada 2012 - replace Fixed_Decimal_Type'Round() with customised version?

最近我在为自定义记录类型提供自己的替换 'Write () 过程时取得了令人愉快的成功,例如...

   type Pixel_Format is
      record
         --  blah blah
      end record;

   procedure Pixel_Format_Write (
     Stream : not null access Root_Stream_Type'Class;
     Item : in Pixel_Format);

   for Pixel_Format'Write use Pixel_Format_Write;

我在写入网络流时使用它来将某些记录成员从小端转换为大端。干得漂亮。

出于同样的想法,我想知道是否可以替换十进制定点类型的 'Round () 函数,所以我尝试了一个快速而肮脏的测试...

   --  This is a "Decimal Fixed Point" type
   type Money_Dec_Type is delta 0.001 digits 14;

   --  ...

   function Money_CustomRound(X : in Money_Dec_Type)
     return Money_Dec_Type'Base;

   for Money_Dec_Type'Round use Money_CustomRound; -- COMPILER COMPLAINS HERE

   --  ...

   function Money_CustomRound(X : in Money_Dec_Type)
     return Money_Dec_Type'Base is

     begin
        return 0.001;
   end Money_CustomRound;

唉,GNAT 认为这令人反感:

attribute "Round" cannot be set with definition clause

问题:

我是在尝试不可能的事情吗?或者有没有办法改变默认的 'Round 属性,就像改变 'Write 一样?

问题背景:

我有一套大约 15 种不同的舍入货币值的方法,这些方法从一个项目到另一个项目(有时在同一个项目中!)。示例包括:

通过使用在通用包级别定义的某些舍入方法,能够使这种功能对程序员透明,这将是一个强大的工具。

我另一边肩膀上的天使暗示我在要求一些完全疯狂的东西。

我想知道这一点,因为文档(ALRM 和 "Barnes 2012")都给出了默认过程的功能规范。如果不能用自己的设计替换它,他们为什么要这样做?

不,您不能重新定义 Round 属性。属性只能被查询(参见 RM K.2). Only aspects can be (re)defined using an aspect specification (see RM K.1;一些例外情况适用)。 RM 给出了属性背后的功能规范,以阐明 reader.

的签名