在 delphi 中测试泛型的类型
Testing the type of a generic in delphi
我想要一些方法在 delphi 中编写函数,如下所示
procedure Foo<T>;
begin
if T = String then
begin
//Do something
end;
if T = Double then
begin
//Do something else
end;
end;
即:我希望能够基于通用类型做不同的事情
我试过在 System
中使用 TypeInfo
但这似乎适合于对象而不是泛型类型。
我什至不确定这在 pascal 中是否可行
从 XE7 开始您可以使用 GetTypeKind
to find the type kind:
case GetTypeKind(T) of
tkUString:
....
tkFloat:
....
....
end;
当然 tkFloat
识别所有浮点类型,因此您也可以测试 SizeOf(T) = SizeOf(double)
。
旧版本的 Delphi 没有 GetTypeKind
内在函数,您必须改用 PTypeInfo(TypeInfo(T)).Kind
。 GetTypeKind
的优点是编译器能够评估它并优化掉可以证明不会被选择的分支。
所有这些都违背了泛型的目的,人们想知道您的问题是否有更好的解决方案。
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;
我想要一些方法在 delphi 中编写函数,如下所示
procedure Foo<T>;
begin
if T = String then
begin
//Do something
end;
if T = Double then
begin
//Do something else
end;
end;
即:我希望能够基于通用类型做不同的事情
我试过在 System
中使用 TypeInfo
但这似乎适合于对象而不是泛型类型。
我什至不确定这在 pascal 中是否可行
从 XE7 开始您可以使用 GetTypeKind
to find the type kind:
case GetTypeKind(T) of
tkUString:
....
tkFloat:
....
....
end;
当然 tkFloat
识别所有浮点类型,因此您也可以测试 SizeOf(T) = SizeOf(double)
。
旧版本的 Delphi 没有 GetTypeKind
内在函数,您必须改用 PTypeInfo(TypeInfo(T)).Kind
。 GetTypeKind
的优点是编译器能够评估它并优化掉可以证明不会被选择的分支。
所有这些都违背了泛型的目的,人们想知道您的问题是否有更好的解决方案。
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;