参考重载函数(或过程)

And*_*and 6 delphi overloading anonymous-function typechecking

我用的是这种类型

type
  TRealFunction = reference to function(const X: extended): extended;
Run Code Online (Sandbox Code Playgroud)

在我的代码中很多.假设我有一个变量

var
  rfcn: TRealFunction;
Run Code Online (Sandbox Code Playgroud)

并尝试分配Math.ArcSec给它:

rfcn := ArcSec;
Run Code Online (Sandbox Code Playgroud)

这与Delphi 2009中的预期一样,但现在我尝试在Delphi 10.2中编译它,并且编译器感到不安:

[dcc32 Error] Unit1.pas(42): E2010 Incompatible types: 'TRealFunction' and 'ArcSec'
Run Code Online (Sandbox Code Playgroud)

所不同的,似乎是ArcSec超载德尔福10.2:它有single,doubleextended口味.看起来编译器不喜欢引用这种类型的重载函数(或过程)(太类似的类型?).

但是,如果我重新定义

type
  TRealFunction = function(const X: extended): extended;
Run Code Online (Sandbox Code Playgroud)

它编译得很好.

当然,这里有明显的解决方法:我可以定义

function ArcSec(const X: extended): extended; inline;
begin
  result := Math.ArcSec(X);
end;
Run Code Online (Sandbox Code Playgroud)

或者我可以写

rfcn := function(const X: extended): extended
  begin
    result := Math.ArcSec(x);
  end;
Run Code Online (Sandbox Code Playgroud)

尽管如此,这仍然需要编写很多代码.有更简单的解决方法吗?

LU *_* RD 4

这有效:

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;
  ...
Run Code Online (Sandbox Code Playgroud)

它需要额外的类型声明,但也许值得付出努力。