kann man in Abhängigkeit des Variablentyps, mit dem eine generische Klasse spezialisiert wird, spezifische codes erstellen?
Habe aktuell eine Basisklasse für Funktionen aller Art und die Funktionswerte können entweder einfache Zahlen sein, Arrays mit fixer Größe für Mehrdimensionalität oder auch Arrays mit dynamischer Größe, falls die Anzahl der Dimensionen variieren kann.
Um zum Beispiel die Anzahl der Dimensionen abzufragen verwende ich aktuell folgenden Code:
Code: Alles auswählen
type
MD1d = Precision;
MD2d = array [0..1] of Precision;
MD3d = array [0..2] of Precision;
MDnd = packed object
private
function readA(i: cardinal): Precision; inline;
procedure writeA(i: cardinal; AValue: Precision); inline;
public
a : array of Precision;
property a_ [i:cardinal] : Precision read readA write writeA; default;
strict private
{%H-}placeholder : byte; // this is to ensure, that sizeOf(MDnd) is not equal to any of the static array types!
end;
PMDnd = ^MDnd;
class function Multidimensional.dim(const a: Preimage): cardinal; inline;
begin
if (SizeOf(a) = SizeOf(MDnd)) then {%H-}result := length(PMDnd(@a)^.a)
else {%H-}result := SizeOf(a) div sizeof(Precision);
end;

Aber cooler wäre natürlich, man könnte etwas in der Art
Code: Alles auswählen
{$IF a is TArrayType} [...] {$ELSE} [...] {$ENDIF}
Liege ich mit dieser Einschätzung richtig, oder kann ich hoffen, in naher Zukunft auf das Workaround mit sizeOf verzichten zu können?
By the way: Weil die Generics noch so neu sind, gibt es Codes, die FPC zwar korrekt kompiliert, die der Quelltexteditor in Lazarus aber als ungültig einstuft. Dann geht keine Codevervollständigung mehr. Auch nicht in units, die auf soetwas aufbauen.
Beispiel:
Code: Alles auswählen
generic TGen2<G> = class(specialize TGen1<G>.TSomeSubclass)
Code: Alles auswählen
const nix = 1/{$IFDEF NIX}1{$ENDIF}/1 {$DEFINE NOCOMPILE}
;
[...]
generic TGen2<G> = class(specialize TGen1<G>{$IFNDEF NOCOMPILE}.TSomeSubclass{$ENDIF})
