【问题标题】:Free Pascal to Delphi conversion - Generic T default parameters免费 Pascal 到 Delphi 转换 - Generic T 默认参数
【发布时间】:2018-07-06 21:03:11
【问题描述】:

我正在尝试将一些 Free Pascal 代码转换为使用 Delphi 10.2 进行编译。

Free Pascal 代码的结构如下:

generic TVolume<T> = class(TObject)
    // T has to be a numerical/float type
    constructor Create(pSizeX, pSizeY, pDepth: integer; c: T = 0);
    constructor Create(Original: TBits; pFalse: T = -0.5; pTrue: T = +0.5);

Delphi 不喜欢这样:E2268: Parameters of this type cannot have default values

我认为原因很简单,因为 Delphi 编译器不想假设 T 可能是什么类型,所以它拒绝编译它。这一点我想说的是 FPC。

要解决这个问题,我很可能必须创建一堆 overload 方法:

TVolume<T> = class(TObject)
    constructor Create(pSizeX, pSizeY, pDepth: integer); overload;
    constructor Create(pSizeX, pSizeY, pDepth: integer; c: T); overload;

    constructor Create(Original: TBits); overload;
    constructor Create(Original: TBits; pFalse: T); overload;
    constructor Create(Original: TBits; pFalse: T; pTrue: T); overload;

但我仍然想知道在 Delphi 中是否有一种方法可以做到这一点,我还不知道?

【问题讨论】:

    标签: delphi migration freepascal


    【解决方案1】:

    这个问题的简单答案是:

    ,在 Delphi 中无法将默认参数传递给泛型类型T,因为在声明时不知道T 的类型。而且由于 Delphi 是一个单遍编译器,它不允许这样做。

    Free Pascal 实现了2-pass processing of Generics。这就是为什么它可以延迟 Generic 的代码生成,直到它在实现时遇到专门化。

    在这种特定情况下,我们发现TVolume 的通用声明甚至都不需要。在整个 Free Pascal 项目中,TVolume&lt;T&gt; 仅作为TNNetVolume = class (specialize TVolume&lt;TNeuralFloat&gt;) 实现一次。 TNeuralFloat 的类型为 Single。所以TVolume&lt;T&gt;的通用声明可以更改为TVolumeT的所有引用都可以替换为TNeuralFloat。这很有效,可以在 Delphi 中编译。

    感谢 Rudy Velthuis Remy LebeauDavid Heffernan 为解决此问题提供的帮助和贡献。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      相关资源
      最近更新 更多