免费Pascal到Delphi转换-通用T默认参数

时间:2018-07-06 21:03:12

标签: delphi migration freepascal

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

免费的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中是否有一种方法,我还不知道吗?

1 个答案:

答案 0 :(得分:2)

这个问题的简单答案是:

  

,由于在声明时未知public bool UploadAvatar(string UserID, string Base64String) { if (string.IsNullOrEmpty(Base64String)) { ReturnMessage = "Profile picture upload failed. No data from photo!"; return false; } if (Base64ImageToFile(Base64String, filename, System.Drawing.Imaging.ImageFormat.Jpeg)) { ReturnMessage = "Profile picture uploaded successfully!"; return true; } ReturnMessage = "Failure uploading your profile picture!"; return false; } public bool Base64ImageToFile(string Base64String, string SaveAs, System.Drawing.Imaging.ImageFormat Format) { try { //Remove this part "data:image/jpeg;base64," Base64String = Base64String.Split(',')[1]; //Base64String = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ......" //This is where the error occurs byte[] bytes = Convert.FromBase64String(Base64String); Image image; using (var ms = new MemoryStream(bytes)) { image = Image.FromStream(ms); } image.Save(SaveAs, Format); return true; } catch (Exception ex) { ReturnMessage = ex.Message; return false; } } 的类型,因此无法将默认参数传递给Delphi中的泛型类型T。而且由于Delphi是单遍编译器,因此不允许这样做。

免费Pascal 实现了2-pass processing of Generics。这就是为什么它可以延迟泛型的代码生成,直到在实现过程中遇到专业化的情况。

在这种特定情况下,我们发现甚至都不需要通用声明T。在整个Free Pascal项目中,TVolume仅作为TVolume<T>实施一次。 TNNetVolume = class (specialize TVolume<TNeuralFloat>)的类型为TNeuralFloat。因此,Single的通用声明可以更改为TVolume<T>,并且TVolume的所有引用都可以替换为T。该方法可以在Delphi中进行编译。

感谢Rudy Velthuis Remy LebeauDavid Heffernan的帮助和贡献,以解决这一问题。 :)