There are no restrictions on the type T1, T2 in the definition of TTuple. This is why you cannot call the destructor because it can be any type, double / integer, etc. Direct answer to your question:
PObject(@fItem1).DisposeOf;
But it will work correctly only when T1 is a class. The correct solution is to define a TTuple with type restrictions:
TTuple<T1: class; T2> = class
Then you can free it in the usual way:
fItem1.Free
To do this in Delphi style, you can create two general classes:
TTuple<T1,T2> = class
...
end;
TObjectTuple<T1: class; T2> = class<TTuple<T1,T2>>
...
property OwnsKey: boolean;
end;
destructor TObjectTuple<T1,T2>.destroy;
begin
if OwnsKey then
FItem1.DisposeOf;
end;
, ,
TObjectList<T: class>