【问题标题】:Testing the type of a generic in delphi在delphi中测试泛型的类型
【发布时间】:2015-09-11 15:01:33
【问题描述】:

我想要一些在delphi中编写函数的方法,如下所示

procedure Foo<T>;
begin
    if T = String then
    begin
        //Do something
    end;

    if T = Double then
    begin
        //Do something else
    end;
end;

ie:我希望能够基于泛型类型做不同的事情

我尝试在System 中使用TypeInfo,但这似乎适合对象而不是泛型类型。

我什至不确定这在帕斯卡中是否可行

【问题讨论】:

标签: delphi generics pascal delphi-xe6


【解决方案1】:

从 XE7 开始,您可以使用 GetTypeKind 查找 type kind

case GetTypeKind(T) of
tkUString:
  ....
tkFloat:
  ....
....
end;

当然tkFloat 可以识别所有浮点类型,因此您也可以测试SizeOf(T) = SizeOf(double)

旧版本的 Delphi 没有 GetTypeKind 内在函数,您必须改用 PTypeInfo(TypeInfo(T)).KindGetTypeKind 的优点是编译器能够评估它并优化掉可以证明未被选择的分支。

所有这一切都违背了泛型的目的,人们想知道您的问题是否有更好的解决方案。

【讨论】:

  • FWIW 我链接到 GetTypeKind 文档,尽管它没有记录在案,希望有一天 Emba 文档能赶上。
  • 请注意,如果您想测试T is double,那么if TypeInfo(T) = TypeInfo(double) then ... 也将解析为内在函数并且不会生成任何代码。
【解决方案2】:

TypeInfo 应该可以工作:

type
  TTest = class
    class procedure Foo<T>;
  end;

class procedure TTest.Foo<T>;
begin
  if TypeInfo(T) = TypeInfo(string) then
    Writeln('string')
  else if TypeInfo(T) = TypeInfo(Double) then
    Writeln('Double')
  else
    Writeln(PTypeInfo(TypeInfo(T))^.Name);
end;

procedure Main;
begin
  TTest.Foo<string>;
  TTest.Foo<Double>;
  TTest.Foo<Single>;
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    相关资源
    最近更新 更多