I need to know, first and foremost, if what I'm trying to do is even possible. If it is possible, I then need to know how.
It's far easier to demonstrate the problem rather than explain it so here goes:
I have an "Enhanced Record" (the purpose - though not important to this question - is to produce a "Smart String" type, to replace the normal String type):
TLKString = record
Value: String;
// Some methods here to operate on and build String values
// Allows me to assign String values directly to "instances"
// of this record type! I have others (hence "overload") to
// handle other data types (such as Integer etc.)
class operator Implicit(const AValue: String): TLKString; overload;
end;
I can now use this TLKString type as follows:
var
LSmartString: TLKString;
begin
LSmartString := 'Hello World'; // The "Implicit" operator then
// assigns this to LSmartString.Value
end;
Okay, so far everything is great! Now we get to the problem...
I need to be able to assign the value of LSmartString (an "instance" of TLKString) to a normal String variable...
var
LSmartString: TLKString;
LNormalString: String;
begin
LSmartString := 'Hello World';
// The next line works fine, but is not what I want!
LNormalString := LSmartString.Value;
LNormalString := LSmartString; // E2010 (Incompatible Types)
end;
This is where I come unstuck, as (I'm sure you'll notice), the last line of the above snip results in E2010 Incompatible types: 'string' and 'TLKString'. I, of course, knew this would be the case... what I don't know if it's possible to overcome by overloading an operator on my TLKString record type, and if so, what operator I need to overload to do it.
If this isn't possible, then it strikes me as a little silly of CodeGear and Embarcadero to have Implicit
and Explicit
operators to handle assignment of values to an enhanced Record type, but no operator to handle the inverse.