我正在寻找一种简单且理想通用(或使用泛型)的方法来转换 array
到array of const
(=array of TVarRec
)。我的具体情况是我有一个 array of Variant
并想将其传递给Format()
功能。
这是我到目前为止所发现的,但对我来说看起来很黑客:
function MyFormat(const Fmt: string; const Args: TArray<Variant>): string;
var
A: array of TVarRec;
I: Integer;
begin
SetLength(A, Length(Args));
for I:= Low(Args) to High(Args) do begin
A[I].VType:= vtVariant;
A[I].VVariant:= @Args[I];
end;
Result:= Format(Fmt, A);
end;
这似乎有效。安全吗?
是否可以做得更短、更好、更快,或者我可以使用现成的东西来代替? :)
一些额外的想法和有趣的事实:
System.Rtti.TValue
最近成为我的 friend 。然而,这里似乎缺少一个功能。我可以使用 TValue.From()
读取我的数组,但似乎没有办法将其取出为 array of TVarRec
。有一个精彩TValueArrayToArrayOfConst
,但这并没有真正的帮助,因为我必须构造一个 array of TValue
首先,这与存储在单个TValue
中的数组不同。 ... :(
至少 TValue 能够将单个元素输出为 TVarRec,因此我认为我可以为所有类型的数组创建一个通用转换器。但是...
你认为这有效吗?
for I:= Low(Args) to High(Args) do A[I]:= TValue.From(Args[I]).AsVarRec;
它可以编译,但是 TValue
的内存在使用后被释放,并且自 TVarRec.VVariant
是一个指针,然后它指向某个旧位置,该位置将在下一个周期被覆盖。
最佳答案
您的函数安全且快速。它只分配一个小的内存数组A[]
,并通过引用传递所有值。我无法更快地思考任何事情 - 而不是过早的优化。我可能只会做一些重构来重用 TArray<variant>
进入TArray<TVarRec>
转换例程。
使用TValue.From().AsVarRec
如果您的输入确实是TArray<Variant>
,那么肯定会更慢.
关于TVarRec
dandling 引用,你是对的:这些结构只是堆栈上的简单指针,没有分配,因此所有引用的变量在函数调用期间都应该可用。因此,如果您使用 TArray<TVarRec>
本地转换,您应该确保TArray<variant>
调用format()
时仍然分配功能。
关于arrays - Delphi 中将数组转换为 const 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50585956/