On 22.11.2015 21:29, Anthony Walter wrote:
Test 2 works but with notes:
function Find<T>: T;
var
I: Integer;
begin
for I := 0 to Form1.ComponentCount - 1 do
if Form1.Components[I].InheritsFrom(T) then
Exit(T(Form1.Components[I]));
Result := nil;
end;
Example 2 usage:
Find<TShape>.Brush.Color := clRed;
Notes:
Cannot use 'as' or 'is' operators. I had to use
if Form1.Components[I].InheritsFrom(T) then
Exit(T(Form1.Components[I]));
Instead of
if Form1.Components[I] is T then
Exit(Form1.Components[I] as T);
Of course, because T is not an object (though one could argue that
everywhere else regarding generics we are much less picky...).
Nevertheless since you're in mode Delphi anyway, this wouldn't work in
Delphi either.
I could not use this as a method, for example:
function TForm1.Find<T>: T;
Please show the code and the error message, because here it works.
Question:
Will it be possible to use type constraints?
function TForm1.Find<T: TComponent>: T;
or
function Find<T: TComponent>: T;
Already works (and there you can use "as" and "is", though this would
already work with a "TObject" or - Delphi compatible - "class"
constraint). [Constraints themselves are already part of 3.0.0]
Test 3 does not work:
function Compare<T>(constref A, B: T): Integer;
begin
if A > B then
Result := 1
else if B > A then
Result := -1
else
Result := 0;
end;
procedure Test3;
var
Items: TArrayList<Single>; // See Codebot.System
begin
Randomize;
Items.Push(Random * 100);
Items.Push(Random * 100);
Items.Push(Random * 100);
Items.Push(Random * 100);
// compile fails below
Items.Sort(soDescend, @Compare<Single>); // cannot take address of
Compare<Single>
end;
As mentioned in my announcement this is a limitation I have yet to address.
Regards,
Sven
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal