[原创]在Delphi高效率的使用函数指针, TProc和TFunc类型.
[简介]
常用网名: 猪头三
出生日期: 1981.XX.XX
QQ: 643439947
个人网站: 80x86汇编小站
编程生涯: 2001年~至今[共23年]
职业生涯: 20年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测
[序言]
由于最近又开始做一些代码转换, C++转换到Delphi, 这里涉及到函数指针的利用. 那么在最新的Delphi中, 针对函数指针, 提供了使用更方便的: TProc和TFunc类型.
[Delphi的内置原生封装]
type
TProc = reference to procedure;
TProc<T> = reference to procedure (Arg1: T);
TProc<T1,T2> = reference to procedure (Arg1: T1; Arg2: T2);
TProc<T1,T2,T3> = reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3);
TProc<T1,T2,T3,T4> = reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4);
TFunc<TResult> = reference to function: TResult;
TFunc<T,TResult> = reference to function (Arg1: T): TResult;
TFunc<T1,T2,TResult> = reference to function (Arg1: T1; Arg2: T2): TResult;
TFunc<T1,T2,T3,TResult> = reference to function (Arg1: T1; Arg2: T2; Arg3: T3): TResult;
TFunc<T1,T2,T3,T4,TResult> = reference to function (Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4): TResult;
TPredicate<T> = reference to function (Arg1: T): Boolean;
由上面可以看出, 上述的类型定义是用于在Delphi中定义0到4个泛型参数的过程和函数类型.
过程类型(TProc): 被定义为对可以接受0到4个任意类型参数的过程的引用, 参数类型在名称后面紧跟着的尖括号<...>内指定. 例如,TProc<T1, T2>是对带有两个参数(Arg1为T1类型, Arg2为T2类型)的过程的引用.
函数类型(TFunc): 被定义为对可以接受0到4个任意类型参数的函数的引用, 与过程类型类似, 参数类型在名称后面紧跟着的尖括号<...>内指定, 函数的返回类型在最后以冒号指定.例如, TFunc<T1, T2, TResult>是对带有两个参数(Arg1为T1类型, Arg2为T2类型)并返回TResult类型值的函数的引用.
这些类型在Delphi中定义委托和回调时非常有用, 它们可以接受和返回不同范围的参数和返回类型, 使得更加灵活和适应性强. 此外, 使用泛型类型允许代码在不需要为每种特定数据类型定义单独版本的相同函数或过程的情况下重复使用.
[简单的代码使用案例]
fun_ReverseString()函数分配给定义为泛型类型TFunc<string, string>的名为func_CallBack的变量。这意味着func_CallBack是对ReverseString()函数的引用.
function fun_ReverseString(str_param_Input: string): string;
var
int_Index: Integer;
begin
Result := '';
for int_Index := Length(str_param_Input) downto 1 do
Result := Result + str_param_Input[int_Index];
end;
procedure TForm1.Button11Click(Sender: TObject);
var
func_CallBack : TFunc<string, string> ;
begin
func_CallBack := fun_ReverseString ;
ShowMessage(func_CallBack('123456789')) ;
end;// End Button11Click()
[总结]
TProc和TFunc类型是Delphi中的一个重要特性, 它们使得更高级的编程概念成为可能, 例如高阶函数, 函数式编程和事件处理. 通过定义具有泛型参数的过程和函数类型, 开发人员可以创建更加灵活和可重用的代码, 使其适应各种不同的使用情况.