我正在尝试使用允许内联转换或赋值的变体记录类型参数创建一个函数,如下所示:
type rectype = ( VT_INT, VT_CHAR, VT_BOOL );
rec = record
case t : rectype of
VT_INT : ( i : integer );
VT_CHAR : ( c : char );
VT_BOOL : ( b : boolean );
end;
procedure handler( r : rec );
begin
case r.t of
VT_INT : { do something with r.i }
VT_CHAR : { do something with r.c }
VT_BOOL : { do something with r.b }
end;
end;
现在,上面的“工作”很好,只要您花时间手动设置变量,如下所示:
r.t := VT_INT;
r.i := 42;
handler( r );
但是,我想稍微滥用一下打字系统,并尝试内联(我稍后会解释原因),大致如下:
handler( rec( VT_INT, 42 ) );
辅助函数也可以,我尝试了几种不同的方法来做到这一点,可以在这里看到(为了简洁起见):
http://pastie.org/private/glxhwbpsbbh5gtxju0uvxa
现在,原因是:我正在研究,并且确实发布了一个单元测试套件,旨在与 Pascal 本身一样可移植(在 FreePascal 和 Turbo Pascal 7 下构建(是的,真的))。我已经公开发布了开源软件(还不能链接,rep不够),其中包括针对不同类型的不同功能:isI()、isR()、isS()、isP()、isC()等。这重复了很多代码,我知道有更好的方法来做到这一点。我相信 FPC 和 Delphi 支持一种变体类型,我可以在这些平台上通过 IFDEF 指令使用它,但真正的关键是 TP7,出于淫秽的原因我仍然想支持它。
每个函数调用 4 行来设置记录的原因实际上并不可行,因为这是面向用户的 API,并且进行复杂的测试意味着没有人会这样做。使用当前 API 的测试集很简单,只需一个函数调用即可执行每个测试,我只是希望可以将所有几个特定于类型的函数转换为如下内容:
is( VT_INT, SomeIntFunc( v ), 42, 'Test Name' );
我愿意竭尽全力避免在 TP7 下打字,包括自己在汇编中操作堆栈等。但我希望使用我不熟悉的语法的修改版本能够完成这项工作。
所以,老派的 Pascal 程序员(我知道肯定有一些),有什么建议吗?