gpt4 book ai didi

delphi - Free Pascal 到 Delphi 的转换 - Generic T 默认参数

转载 作者:行者123 更新时间:2023-12-02 02:47:05 24 4
gpt4 key购买 nike

我正在尝试转换一些 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:此类型的参数不能有默认值

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

为了解决这个问题,我很可能必须创建一堆重载方法:

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 中是否有一种方法可以做到这一点,我还不知道?

最佳答案

这个问题的简单答案是:

No, there is no way to pass default parameters to a Generic type T in Delphi, because the type of T is not known at the time of declaration. And since Delphi is a single-pass compiler, it does not allow this.

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

在这个具体案例中,我们发现通用声明 TVolume无论如何,甚至不需要。在整个 Free Pascal 项目中,TVolume<T>仅实现一次,如 TNNetVolume = class (specialize TVolume<TNeuralFloat>)TNeuralFloat类型为Single 。所以通用声明TVolume<T>可以改为TVolume以及 T 的所有引用文献可以替换为TNeuralFloat 。这可以工作并且可以在 Delphi 中编译。

感谢Rudy Velthuis , Remy LebeauDavid Heffernan感谢他们为解决这个问题提供的帮助和贡献。 :)

关于delphi - Free Pascal 到 Delphi 的转换 - Generic T 默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51217569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com