I use the type
type
TRealFunction = reference to function(const X: extended): extended;
a lot in my code. Suppose I have a variable
var
rfcn: TRealFunction;
and try to assign Math.ArcSec
to it:
rfcn := ArcSec;
This works just as expected in Delphi 2009, but now I tried to compile it in Delphi 10.2, and the compiler gets upset:
[dcc32 Error] Unit1.pas(42): E2010 Incompatible types: 'TRealFunction' and 'ArcSec'
The difference, it seems, is that ArcSec
is overloaded in Delphi 10.2: it comes in single
, double
, and extended
flavours. It seems like the compiler doesn't like references to overloaded functions (or procedures) of this kind (too similar types?).
However, if I redefine
type
TRealFunction = function(const X: extended): extended;
it compiles just fine.
Of course, there are obvious workarounds here: I could define
function ArcSec(const X: extended): extended; inline;
begin
result := Math.ArcSec(X);
end;
or I could just write
rfcn := function(const X: extended): extended
begin
result := Math.ArcSec(x);
end;
Still, this is a lot of code to write. Is there a simpler workaround?
This works:
type
TRealFunction = function(const X: extended): extended;
const
rc : TRealFunction = Math.ArcSec;
type
TRealFunctionRef = reference to function(const X: Extended) : Extended;
var
rfcn: TRealFunctionRef;
begin
rfcn := rc;
...
It requires an extra type declaration, but perhaps it is worth the effort.