Am 11.10.2012 22:58, schrieb Anthony Walter:
Okay, I looked into global operators a bit more and I think what you
are referring to is objpas mode operator functions. If this is the
case, then there is a problem because I don't believe objpas mode
supports explicit conversions.


They do, see below.

For clarity, I believe the correct intended use of explicit
conversions is when a loss of data may occur while converting a type
(rounding a float for example), and implicit conversions are correct
when no loss of data can occur (assigning a 32bit integer to a 32bit
float).

type
   Float = Single;
   TPointI = TPoint<Integer>;
   TPointF = TPoint<Float>;

FloatPoint := IntPoint; // correct, no loss of data
IntPoint := FloatPoint; // incorrect, data might be lost
IntPoint := TPointI(FloatPoint); // okay, data might be lost but
explicit conversion was used

I don't think the above is currently possible given that you cannot
define Implicit or Explicit operators on TPointI or TPointF since they
are specialized from a generic record type (no inheritance).

If you don't know whether something works, you should just try it:

=== source begin ===

program asgnoptest;

{$mode objfpc}
{$modeswitch advancedrecords}

type
  generic TPoint<T> = record
    X, Y: T;
  end;

  TPointF = specialize TPoint<Single>;
  TPointI = specialize TPoint<LongInt>;

operator := (const Value: TPointI): TPointF;
begin
  Writeln('Implicit');
  Result.X := Value.X;
  Result.Y := Value.Y;
end;

operator Explicit(const Value: TPointF): TPointI;
begin
  Writeln('Explicit');
  Result.X := Round(Value.X);
  Result.Y := Round(Value.Y);
end;

var
  FloatPoint: TPointF;
  IntPoint: TPointI;
begin
  IntPoint.X := 21;
  IntPoint.Y := 42;

  FloatPoint := IntPoint;

  // No implicit from TPointF -> TPointI
  //IntPoint := FloatPoint;

  FloatPoint.X := 42.5;
  FloatPoint.Y := 21.25;

  IntPoint := TPointI(FloatPoint);

end.

=== source end ===

This compiles using 2.6.0. The output is (as expected):

=== output begin ===

Implicit
Explicit

=== output end ===

The only difference to operators in helpers would be that they aren't "grouped" in one structure.

That said: I'm not opposing your idea to allow operators in helpers (and classes) per se, but I just suggest you how you can acomplish your target with FPC's current features as I don't know when I'd get around to implement this.

Regards,
Sven

--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to