gpt4 book ai didi

delphi - 具有不同签名的函数指针(例如 : optional parameter with a default value)

转载 作者:行者123 更新时间:2023-12-03 15:06:47 29 4
gpt4 key购买 nike

是否可以创建一个带有默认参数的函数指针,例如

TFunctionPointer = function(sName:AnsiString; tOptional: TObject = nil):smallint;

我想要实现的目标:

函数指针,可以接受类型的函数

function A(sName:AnsiString)

function B(sName:AnsiString, tOptional: TObject)

我怎样才能实现这个目标?

最佳答案

默认参数只是一个语法糖 - 实际上函数调用有两个参数。

但是您可以使用函数引用和匿名方法来创建此类函数指针 - 函数适配器。

type
fnA = function(const sName: AnsiString): integer;
fnB = function(const sName: AnsiString; const tOptional: TObject); integer;

fnRef = reference to function(const sName: AnsiString; const tOptional: TObject): integer;

fnBridge = record
Bridge: fnRef;
class operator Implicit(fn: fnA): fnBridge;
class operator Implicit(fn: fnB): fnBridge;
end;

class operator fnBridge.Implicit(fn: fnA): fnBridge;
begin
Result.Bridge :=
function(const sName: AnsiString; const tOptional: TObject): integer
begin
Result := fn(sName);
end;
end;

class operator fnBridge.Implicit(fn: fnB): fnBridge;
begin
Result.Bridge :=
function(const sName: AnsiString; const tOptional: TObject): integer
begin
Result := fn(sName, tOptional);
end;
end;

function A(const sName: AnsiString): integer;
begin Result := Length(sName) end;

function B(const sName: AnsiString; const tOptional: TObject): integer;
begin Result := Length(sName) - Length(tOptional.ClassName) end;

function Consumer (const Param1, Param2: integer; const Action: fnBridge): integer;
begin
Result := Param1 + Param2 * Action.Bridge('ABCDE', Application);
end;

....
ShowMessage( IntToStr( Consumer(10, 20, A) ));
ShowMessage( IntToStr( Consumer(10, 20, B) ));

PS:由于未指定 Delphi 版本,这意味着任何 Delphi 版本的答案都适合。此方法应该适用于从 Delphi 2009 及更高版本开始的任何版本。

PPS:对具有捕获变量的函数的引用在内部实现为 TInterfacedObject 后代。所以总的来说,这只是使用“高阶函数”的“策略模式”的简化情况

关于delphi - 具有不同签名的函数指针(例如 : optional parameter with a default value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19807406/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com