首页 > 解决方案 > Ada 2012 - 用定制版本替换 Fixed_Decimal_Type'Round()?

问题描述

最近,我在为自定义记录类型提供自己的替换'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”)都给出了默认过程的功能规范。如果一个人不能用自己设计的另一个代替它,他们为什么要这样做?

标签: roundingadafixed-point

解决方案


不,您不能重新定义Round属性。只能查询属性(参见RM K.2)。只有方面可以使用方面规范(参见RM K.1;一些例外情况适用)来(重新)定义。RM 给出了属性背后的功能规范,以向读者阐明签名。


推荐阅读