Skip to content

Instantly share code, notes, and snippets.

@superswanman
Created September 11, 2016 16:04
Show Gist options
  • Select an option

  • Save superswanman/886ed984d230ac1b42dd89ed42ab2214 to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown

ci70 commented Oct 23, 2016

Hi not work for records...

@errorcalc
Copy link
Copy Markdown

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
Copy Markdown

Is it possible to overload for interface types?

@sglienke
Copy link
Copy Markdown

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