Skip to content

Instantly share code, notes, and snippets.

@superswanman
Created September 11, 2016 16:04
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save superswanman/886ed984d230ac1b42dd89ed42ab2214 to your computer and use it in GitHub Desktop.
Save superswanman/886ed984d230ac1b42dd89ed42ab2214 to your computer and use it in GitHub Desktop.
Use operator overloading for classes with non-ARC compiler
program Project1;
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.Classes, System.Types, Vcl.Dialogs;
type
TStringListEx = class(TStringList)
public
// class operator In(const A: string; B: TStringListEx): Boolean;
class function &&op_In(const A: string; B: TStringListEx): Boolean; static;
end;
TPointHelper = record helper for TPoint // Possible in class helper!
public
// class operator Equal(const A: TPoint; const B: string) : Boolean;
class function &&op_Equality(const A: TPoint; const B: string): Boolean; static;
end;
class function TStringListEx.&&op_In(const A: string; B: TStringListEx): Boolean;
begin
Result := B.IndexOf(A) >= 0;
end;
class function TPointHelper.&&op_Equality(const A: TPoint; const B: string): Boolean;
begin
Result := Format('%d,%d', [A.X, A.Y]) = B;
end;
var
sl: TStringListEx;
pt: TPoint;
ret: Boolean;
begin
sl := TStringListEx.Create;
sl.Add('AAA');
sl.Add('BBB');
ret := 'AAA' in sl;
Writeln(BoolToStr(ret, True)); // -> 'True'
pt := Point(123, 456);
ret := pt = '123,456';
Writeln(BoolToStr(ret, True)); // -> 'True'
Readln;
end.
@ci70
Copy link

ci70 commented Oct 23, 2016

Hi not work for records...

@errorcalc
Copy link

list of class operators:
Implicit &&op_Implicit
Explicit &&op_Explicit
Negative &&op_UnaryNegation
Positive &&op_UnaryPlus
Inc &&op_Increment
Dec &&op_Decrement
LogicalNot &&op_LogicalNot
Trunc &&op_Trunc
Round &&op_Round
In &&op_In
Equal &&op_Equality
NotEqual &&op_Inequality
GreaterThan &&op_GreaterThan
GreaterThanOrEqual &&op_GreaterThanOrEqual
LessThan &&op_LessThan
LessThanOrEqual &&op_LessThanOrEqual
Add &&op_Addition
Subtract &&op_Subtraction
Multiply &&op_Multiply
Divide &&op_Division
IntDivide &&op_IntDivide
Modulus &&op_Modulus
LeftShift &&op_LeftShift
RightShift &&op_RightShift
LogicalAnd &&op_LogicalAnd
LogicalOr &&op_LogicalOr
LogicalXor &&op_ExclusiveOr
BitwiseAnd &&op_BitwiseAnd
BitwiseOr &&op_BitwiseOr
BitwiseXor &&op_BitwiseXOR
Include &&op_Include
Exclude &&op_Exclude

@passella
Copy link

Is it possible to overload for interface types?

@sglienke
Copy link

Is it possible to overload for interface types?

No

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment