What kinds of operator overloads does Delphi support?
I wonder what sort of operator overloads are possible (and with what version of Delphi)? Thanks to Hallvard's great write-up on operator overloading, I know of :
- Add(Left, Right: Type): Type (for the '+' operator)
- Subtract(Left, Right: Type): Type (for the '-' operator)
- Multiply(Left, Right: Type): Type (for the '*' operator)
- Divide(Left, Right: Type): Type (for the '/' operator)
- Implicit(aValue: Type): AnotherType and
- Implicit(aValue: AnotherType): Type (for implicit assignments : a := b)
- Explicit(aValue: Type): AnotherType and
- Explicit(aValue: AnotherType开发者_开发百科): Type (for explicit assignmetns of 'casts' : a := Type(b)
However, what I don't know are the names for the '=', '<=', '<', '<>', '>' and '>=' operators. Do these exist, and from what Delphi version can I use these?
PS: I still use Delphi 2009 at the moment, so I would have another strong upgrade-argument if 2010 offers these ;-)
Actually, I found the answer to this myself, but kept the question as I can imagine people will search for this information regularly on stackoverflow;
The official description on operator overloaders can be found here : http://docwiki.embarcadero.com/RADStudio/en/Operator_Overloading_(Delphi)
Mainly, the ones I was looking for are named:
- Equal, for '=' comparison : Equal(a: type; b: type) : Boolean;
- NotEqual, for '<>' comparison : NotEqual(a: type; b: type): Boolean;
- GreaterThan, for '>' comparison : GreaterThan(a: type; b: type) Boolean;
- GreaterThanOrEqual, for '>=' comparison : GreaterThanOrEqual(a: type; b: type): resultType;
- LessThan, for '<' comparison : LessThan(a: type; b: type): resultType;
- LessThanOrEqual, for '<=' comparison : LessThanOrEqual(a: type; b: type): resultType;
I just put my notes online of a session on nullable types with operator overloading that I gave during a few conferences.
It now contains a table of the operators, the names and what works/doesn't work. WordPress initially malformed that table, but I managed to restore it.
You can also download the full set of slides and source code demos.
In short:
- The documentation (even the DocWiki) is not complete, and note reliable
- You cannot overload the bitwise not operator, as BitwiseNot is not supported by the compiler. You have to overload the logical not operator in stead.
- Overload operators pairwise where applicable
- Be aware of existing operators
- Be very careful when implementing implicit operators
Hope this helps you. Let me know if you need more info: I have done quite a bit of production work with operator overloading.
--jeroen
精彩评论