在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论