【发布时间】:2015-06-05 13:28:07
【问题描述】:
我将匿名方法传递给外部函数。匿名方法是一个被积函数,外部函数将计算一个定积分。因为集成功能是外部的,所以它不理解匿名方法。所以我不得不将匿名方法作为无类型指针传递。为了更清楚,它运行如下:
function ExternalIntegrand(data: Pointer; x: Double): Double; cdecl;
begin
Result := GetAnonMethod(data)(x);
end;
....
var
Integrand: TFunc<Double,Double>;
Integral: Double;
....
Integral := CalcIntegral(ExternalIntegrand, CastToPointer(Integrand), xlow, xhigh);
这里的CalcIntegral 是调用ExternalIntegrand 的外部函数。反过来,它获取传递的无类型指针,检索匿名方法,并让它完成这项工作。
问题是我不能干净地写CastToPointer。如果我这样做:
Pointer(Integrand)
编译器对象:
[dcc32 错误]: E2035 实际参数不足
显然编译器正在尝试调用匿名方法。
我可以做到:
function CastToPointer(const F: TFunc<Double,Double>): Pointer; inline;
begin
Move(F, Result, SizeOf(Result));
end;
或者这个:
function CastToPointer(const F: TFunc<Double,Double>): Pointer; inline;
var
P: Pointer absolute F;
begin
Result := P;
end;
但是,我不能像在将动态数组转换为指向数组的指针时那样使用简单的转换,这似乎有点令人讨厌。
我意识到我可以传递保存匿名方法的变量的地址。像这样:
function ExternalIntegrand(data: Pointer; x: Double): Double; cdecl;
var
F: ^TFunc<Double,Double>;
begin
F := data;
Result := F^(x);
end;
....
Integral := CalcIntegral(ExternalIntegrand, @Integrand, xlow, xhigh);
但是,必须引入另一个级别的间接性似乎有点奇怪。
有人知道将匿名方法变量直接转换为指针的方法吗?我确实意识到这种欺骗是值得怀疑的,但至少出于好奇,我想知道它是否可以做到。
【问题讨论】:
-
@J... 在实际 arg 中有效的是匿名方法变量,但如果它是方法或函数则无效。
-
如果您打算将匿名函数和常规函数都传递给
ExternalIntegrand,GetAnonMethod是什么样的?当然,您需要知道类型...常规方法指针不会转换为TFunc<double,double>- 它不需要转换为TFoo = function(x:double):double;吗? -
@J... 我猜你是对的。调用
CalcIntegral的函数接收一个匿名方法作为参数,所以我已经确定了类型。所以,我没有考虑清楚。我们当然可以添加CastToPointer的无类型指针版本,但同样冗长。 -
或者,如果您确实确定只传递匿名方法,那么我认为我的答案不需要额外的方法来进行转换(即:接受无类型参数而不是
Pointer) . -
@J... 我知道。那是我对一个似乎和我一样沮丧的人发牢骚! ;-)
标签: delphi delphi-xe7