Memory management 如何在默认构造函数上使用智能指针

Memory management 如何在默认构造函数上使用智能指针,memory-management,constructor,delphi-xe2,smart-pointers,Memory Management,Constructor,Delphi Xe2,Smart Pointers,所以,我又一次在学习新东西,我遇到了聪明的指针。我有密码 procedure TForm3.BitBtn1Click(Sender: TObject); var _StringList: ISmartPointer<TStringList>; begin _StringList := TSmartPointer<TStringList>.Create(TStringList.Create); end; 正如您所看到的,变量声明有点奇怪,需要简化。我找到了另一个解

所以,我又一次在学习新东西,我遇到了聪明的指针。我有密码

procedure TForm3.BitBtn1Click(Sender: TObject);
var
  _StringList: ISmartPointer<TStringList>;
begin
  _StringList := TSmartPointer<TStringList>.Create(TStringList.Create);
end;
正如您所看到的,变量声明有点奇怪,需要简化。我找到了另一个解决办法

procedure TForm3.btnDelphiClick(Sender: TObject);
var
  _StringList: TStringList;
begin
  _StringList := SmartGuard.SmartGuard<TStringList>(TStringList.Create(False));
end;
遗憾的是,它不适用于无参数构造函数

procedure TForm3.btnDelphiClick(Sender: TObject);
var
  _StringList: TStringList;
begin
  _StringList := SmartGuard.SmartGuard<TStringList>(TStringList.Create);
end;
[dcc32错误]Main.pas47:E2089类型转换无效

我在这里运气不好吗? 另外,我知道你们中的一些人会争辩说我应该坚持尝试……最后阻止,但这是出于好奇

unit SmartGuard;

interface

type
  IGuard = interface
  ['{CE522D5D-41DE-4C6F-BC84-912C2AEF66B3}']
  end;

  TGuard = class(TInterfacedObject, IGuard)
  private
    FObject: TObject;
  public
    constructor Create(AObject: TObject);
    destructor Destroy; override;
  end;

  SmartGuard<T: class> = record
  private
    FGuard: IGuard;
    FGuardedObject: T;
  public
    class operator Implicit(GuardedObject: T): SmartGuard<T>;
    class operator Implicit(Guard: SmartGuard<T>): T;
  end;

implementation

uses
  {Delphi}
  System.SysUtils
  {Project}
  ;

constructor TGuard.Create(AObject: TObject);
begin
  FObject := AObject;
end;

destructor TGuard.Destroy;
begin
  FObject.Free;
  inherited;
end;

{ SmartGuard }

class operator SmartGuard<T>.Implicit(GuardedObject: T): SmartGuard<T>;
begin
  Result.FGuard := TGuard.Create(GuardedObject);
  Result.FGuardedObject := GuardedObject;
end;

class operator SmartGuard<T>.Implicit(Guard: SmartGuard<T>): T;
begin
  Result := Guard.FGuardedObject;
end;

end.

我很想找到一个解决方案,它不需要像这里那样调用额外的方法,例如_StringList.Value.Add'foo';和特殊括号,如_StringList:=TSmartPointer.CreateTStringList.Create

编译器需要帮助消除歧义

TStringList.Create
编译器不知道这是对方法的引用还是对方法的调用

通过添加paren来消除歧义,表明这是一个调用

_StringList := SmartGuard.SmartGuard<TStringList>(TStringList.Create());