将 TStack 代码从 Delphi 转换为 Lazarus

Converting TStack code from Delphi to Lazarus

在 Delphi 中,我有以下代码,一切正常:

var
  StackOptions:TStack<String>;
  s:string;
  bfisio:boolean;
begin
  StackOptions:=TStack<String>.Create;
  //some pushs here 
  for s in StackOptions do begin
    dosomething;
  end;
end;

在 Lazarus 中我可以这样做:

uses
  ..., gstack;

type
  TStringStack = specialize TStack<String>;

var
  StackOptions: TStringStack;
  s:string;
begin
  //But this code doesn;t compile
  StackOptions := TStringStack.Create;
  //some pushs here 
  for s in StackOptions do begin // <-- Error 
    dosomething;
  end;
end;

我在 Lazarus 中遇到下一个错误:

Compile Project, Target: TicketLaz.exe: Exit code 1, Errors: 1
umain.pas(263,12) Error: Cannot find an enumerator for the type "TStack$crcAC3AF268"

如何在不从 Stack 中删除项目的情况下循环 Stack 并使用 Lazarus 搜索值?

FPC 的堆栈由 TVector 支持。
TVector 有一个枚举器。

您可以像这样轻松添加 class 助手:
快速而肮脏的代码。

type
  TStringStack = specialize TStack<String>;

 type

   { TStackHelper }

   TVectorEnumerator = specialize TVector<string>.TVectorEnumerator;

   TStackHelper = class helper for TStringStack
     function GetEnumerator: TVectorEnumerator;
   end;

{ TStackHelper }

function TStackHelper.GetEnumerator: TVectorEnumerator;
begin
  Result:= FData.GetEnumerator;
end;

我真的不明白为什么堆栈不应该有迭代器。
即使在汇编中你也可以简单地做 mov reg,[esp-04].
这种严格的数据结构方法对任何人都没有帮助

由于 TStack 是通用的,这一切都变得复杂了。
我知道 FPC 允许通用 class 助手,但我不确定如何使解决方案适用于所有 TStack<T>

另一种方法是简单地编辑 gstack.pas 以公开迭代器。