,转智能指针的另外一种实现 - Smart pointers in Delphi

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