现在的位置: 首页 > 综合 > 正文

(转)智能指针的另外一种实现 – Smart pointers in Delphi

2012年10月22日 ⁄ 综合 ⁄ 共 2077字 ⁄ 字号 评论关闭

Strongly-typed smart pointers are now possible in Delphi, leveraging the work on generics. Here's a simple smart pointer type:

  TSmartPointer<T: class> = record
  strict 
private
    FValue: T;
    FLifetime: IInterface;
  
public
    
constructor Create(const AValue: T); overload;
    
class operator Implicit(const AValue: T): TSmartPointer<T>;
    
property Value: T read FValue;
  
end;

Here it is in action, where TLifetimeWatcher is a little class that executes some code when it dies:

procedure UseIt;
var
  x: TSmartPointer
<TLifetimeWatcher>;
begin
  x :
= TLifetimeWatcher.Create(procedure
  
begin
    Writeln(
'I died.');
  
end);
end;

Here's the full project code that defines TSmartPointer<>, TLifetimeWatcher, and the above test routine:

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TLifetimeWatcher 
= class(TInterfacedObject)
  
private
    FWhenDone: TProc;
  
public
    
constructor Create(const AWhenDone: TProc);
    
destructor Destroy; override;
  
end;

{ TLifetimeWatcher }

constructor TLifetimeWatcher.Create(const AWhenDone: TProc);
begin
  FWhenDone :
= AWhenDone;
end;

destructor TLifetimeWatcher.Destroy;
begin
  
if Assigned(FWhenDone) then
    FWhenDone;
  
inherited;
end;

type
  TSmartPointer
<T: class> = record
  strict 
private
    FValue: T;
    FLifetime: IInterface;
  
public
    
constructor Create(const AValue: T); overload;
    
class operator Implicit(const AValue: T): TSmartPointer<T>;
    
property Value: T read FValue;
  
end;

{ TSmartPointer<T> }

constructor TSmartPointer<T>.Create(const AValue: T);
begin
  FValue :
= AValue;
  FLifetime :
= TLifetimeWatcher.Create(procedure
  
begin
    AValue.Free;
  
end);
end;

class operator TSmartPointer<T>.Implicit(const AValue: T): TSmartPointer<T>;
begin
  Result :
= TSmartPointer<T>.Create(AValue);
end;

procedure UseIt;
var
  x: TSmartPointer
<TLifetimeWatcher>;
begin
  x :
= TLifetimeWatcher.Create(procedure
  
begin
    Writeln(
'I died.');
  
end);
end;

begin
  
try
    UseIt;
    Readln;
  
except
    on E:Exception 
do
      Writeln(E.Classname, 
'', E.Message);
  
end;
end.

 

Update: Fixed capture - was capturing a location in the structure, which of course will be freely copied etc.

 

原帖地址: http://barrkel.blogspot.com/2008/09/smart-pointers-in-delphi.html

抱歉!评论已关闭.