gpt4 book ai didi

delphi - 如何使用泛型处理普通动态数组?

转载 作者:行者123 更新时间:2023-12-03 18:13:51 25 4
gpt4 key购买 nike

我知道如何操作派生泛型类,如 TList 等。

然而,当我想操作一个普通的动态数组时,我遇到了困难。

如何将以下代码转换为使用泛型的版本?

//code A
function CloneArray(original: TArray_Of_TX): TArray_Of_TX;
var
i: integer;
copy: TX;
begin
Result.SetLength(SizeOf(original));
for i:= 0 to SizeOf(original) -1 do begin
copy:= TX.Create;
copy.assign(original[i]);
Result[i]:= copy;
end; {for i}
end;

如果我使用的是 TList,通用版本将是:

//code B (works, but not on a plain dynamic array)
uses
System.SysUtils, system.classes, Generics.Collections;

type
TMyList<T: TPersistent, constructor > = class(TList<T>)
public
function CloneArray: TMyList<T>;
end;

implementation

function TMyList<T>.CloneArray: TMyList<T>;
var
i: integer;
temp: T;
begin
Result:= TMyList<T>.Create;
for i:= 0 to SizeOf(self) -1 do begin
temp:= T.Create;
temp.assign(self.items[i]);
Result.Add(temp);
end; {for i}
end;

但是该代码不适用于 TArray<T> ,因为您无法访问其 Items属性(property),它没有。如果您使用 array of ...我不明白你如何使用泛型。

如何编写上面代码 A 的通用/泛型版本?

另请参阅我的回答:https://stackoverflow.com/a/23446648/650492我的答案在这里:https://stackoverflow.com/a/23447527/650492

最佳答案

type
TArray = class
class function Clone<T: TPersistent, constructor>(const original: array of T): TArray<T>; static;
end;

function TArray.Clone<T>(const original: array of T): TArray<T>;
var
i: integer;
copy: T;
begin
SetLength(Result, Length(original));
for i := 0 to Length(original) - 1 do
begin
copy := T.Create;
copy.Assign(original[i]);
Result[i] := copy;
end;
end;

关于delphi - 如何使用泛型处理普通动态数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23447612/

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