1

是否有任何有效的方法来为 delphi 泛型添加特定于类型的代码?例如这样的:

function TGT<T>.GetSize(a: T): integer;
begin
  {$IF TypeInfo(T)=TypeInfo(String)}
    result := Length(A);
  {$ELSE}
    result := SizeOf(A);
  {$IFEND}
end;

function TGT<T>.Compare(a,b: T): integer;
begin
  {$IF TypeInfo(T)=TypeInfo(String)}
    result := AnsiCompareText(a,b);
  {$ELSE}
    result := a-b;
  {$IFEND}
end;

所以我需要根据类型以不同的方式实现代码的某些部分。例如,如果我实现排序例程,我想使用整数/双精度/等类型的值的直接比较(它比调用像 delphi 的标准通用容器这样的接口方法更有效)和函数 AnsiCompareText 用于字符串类型。

有一些示例如何执行此操作,但所有示例都基于这样的检查:

if TypeInfo(T)=TypeInfo(String) then xxx else if TypeInfo(T)=TypeInfo(Integer) then xxx

这里的问题是 Delphi 只会在运行时检查它,这(再次)不是那么有效。我想让编译器在编译时进行所有检查,并且只使用特定于所选类型的代码。

4

1 回答 1

1

好吧,您当然不能希望通过条件编译来做类似的事情。请记住,泛型的条件编译是在泛型编译阶段而不是实例化阶段处理的。因此,您不能期望使用条件语句的不同分支来编译不同的实例化。

而且您当然永远无法让编译器接受参数化Length(a)类型的a位置,因为无法指定允许使用Length.

唯一的选择是运行时检查。

于 2013-07-07T20:30:40.393 回答