Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Delphi中为泛型添加特定于类型的代码_Delphi_Generics - Fatal编程技术网

如何在Delphi中为泛型添加特定于类型的代码

如何在Delphi中为泛型添加特定于类型的代码,delphi,generics,Delphi,Generics,有没有有效的方法为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): inte

有没有有效的方法为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;
if TypeInfo(T)=TypeInfo(String) then xxx else if TypeInfo(T)=TypeInfo(Integer) then xxx
这里的问题是Delphi只在运行时检查它,这(再次)不是很有效。
我想让编译器在编译时执行所有检查,并且只使用特定于所选类型的代码。

好吧,您当然不希望在条件编译中执行类似的操作。请记住,泛型的条件编译是在泛型编译阶段而不是实例化阶段处理的。因此,您不能期望使用条件语句的不同分支编译不同的实例化

当然,如果
a
的类型是参数化的,那么您永远无法让编译器接受
Length(a)
,因为无法指定允许使用
Length
的约束


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

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

当然,如果
a
的类型是参数化的,那么您永远无法让编译器接受
Length(a)
,因为无法指定允许使用
Length
的约束


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

我知道条件编译不能解决我的问题,我只是用它来说明。但我希望有另一种方式存在。在Delphi的所有泛型中,我看到了用于完成特定类型任务的接口。它看起来不像是一个坚实而清晰的概念,它看起来像是一种黑客或诡计。引入像泛型这样功能强大的工具似乎很奇怪,但却没有使代码高效的能力。实际上,这意味着对于时间关键型任务,即使是在像数据排序这样的常见例程中,复制粘贴代码而不是使用泛型会更有效。您确定在泛型中使用泛型比较器接口吗?默认值真的那么慢吗?无论如何,泛型不是模板。它们天生不如模板。@David,我最近从你那里读到很多关于“通用编译阶段”的文章。虽然这对我来说很有意义,但这有没有记录在案?@iamjoosy我不这么认为。我在写答案时编造了这个词,我想是这个!有各种各样的Emba博客谈论不同的编译阶段。@David,这当然解释了为什么每个泛型类实例化都会创建一个新类,这有时会导致一些惊喜——比如类变量。我知道条件编译不能解决我的问题,我只是用它来说明。但我希望有另一种方式存在。在Delphi的所有泛型中,我看到了用于完成特定类型任务的接口。它看起来不像是一个坚实而清晰的概念,它看起来像是一种黑客或诡计。引入像泛型这样功能强大的工具似乎很奇怪,但却没有使代码高效的能力。实际上,这意味着对于时间关键型任务,即使是在像数据排序这样的常见例程中,复制粘贴代码而不是使用泛型会更有效。您确定在泛型中使用泛型比较器接口吗?默认值真的那么慢吗?无论如何,泛型不是模板。它们天生不如模板。@David,我最近从你那里读到很多关于“通用编译阶段”的文章。虽然这对我来说很有意义,但这有没有记录在案?@iamjoosy我不这么认为。我在写答案时编造了这个词,我想是这个!有各种各样的Emba博客谈论不同的编译阶段。@David,这当然解释了为什么每个泛型类实例化都会创建一个新类,这有时会导致一些惊喜——比如类变量。