As can be seen in the syntax diagrams for generic procedures and functions, it is possible to define generic procedures and functions or generic methods. Where in a generic class type all methods of the class can contain the template, it is possible to have a non-generic class with a generic method:
uses typinfo; type TMyEnum = (one,two,three); TTypeHelper = class(TObject) generic procedure PrintTypeName<T>(a : T); end; generic procedure TTypeHelper.PrintTypeName<T>(a : T); begin Writeln(PTypeInfo(typeInfo(T)) ˆ.name); end; var Helper : TTypeHelper; begin Helper.specialize PrintTypeName<TMyEnum>(one); end.
or, in Delphi syntax:
uses typinfo; type TMyEnum = (one,two,three); TTypeHelper = class(TObject) procedure PrintTypeName<T>(a : T); end; procedure TTypeHelper.PrintTypeName<T>(a : T); begin Writeln(PTypeInfo(typeInfo(T)) ˆ.name); end; var Helper : TTypeHelper; begin Helper.PrintTypeName<TMyEnum>(one); end.
Both global procedures or functions can also be generic:
ses typinfo; type TMyEnum = (one,two,three); generic function GetTypeName<T>(a : T) : string; begin Result:=PTypeInfo(typeInfo(T))ˆ.name; end; begin Writeln(specialize GetTypeName<TMyEnum>(one)); end.
It is even possible to use them in Delphi mode:
uses typinfo; type TMyEnum = (one,two,three); function GetTypeName<T>(a : T) : string; begin Result:=PTypeInfo(typeInfo(T))ˆ.name; end; begin Writeln(GetTypeName<TMyEnum>(one)); end.
But this code is not compilable with Delphi. In delphi, the closest thing to this feature is to use a record or class with generic class methods:
uses typinfo; type TMyEnum = (one,two,three); TTypeHelper = class(TObject) class procedure PrintTypeName<T>(a : T); end; class procedure TTypeHelper.PrintTypeName<T>(a : T); begin Writeln(PTypeInfo(typeInfo(T)) ˆ.name); end; begin TTypeHelper.PrintTypeName<TMyEnum>(one); end.