Wie kann ich testen, ob ein Typ mit Verschieben sicher kopiert werden kann?
Ich schreibe einen generischen Vektortyp:
type
TBigVector<T: record> = class
private
FSize: Integer;
FEntries: TArray<T>;
function GetEntry(Index: Integer): T;
procedure SetEntry(Index: Integer; const Value: T);
procedure SetSize(Value: Integer);
public
constructor Create(ASize: Integer);
property Size: Integer read FSize write SetSize;
property Entry[Index: Integer]: T read GetEntry write SetEntry; default;
procedure Zeroise;
function ToArray: TArray<T>;
end;
Ich möchte dann Klassen wie diese ableiten:
TDoubleBigVector = class(TBigVector<Double>)
....
end;
TComplexBigVector = class(TBigVector<Complex>)
....
end;
Ich muss Klassen ableiten, weil ich keine arithmetischen Operationen im generischen Typ implementieren kann. Das liegt daran, dass allgemeine Einschränkungen nicht reich genug sind, um mich einzuschränkenT
die erforderlichen Rechenoperationen zu unterstützen. Grr!
Genug davon. Meine Frage betrifft die Umsetzung vonZeroise
undToArray
. Aus Performancegründen möchte ich Raw-Memory-Operationen verwenden. Zum Beispiel,Zeroise
könnte sein:
procedure TBigVector<T>.Zeroise;
begin
ZeroMemory(Pointer(FEntries), Size*SizeOf(T));
end;
Nun, ich kann das gut für Typen wieDouble
und meine maßgeschneiderteComplex
Art. Ich weiß, dass sie nicht verwaltet werden und eine rohe Speicherkopie keine Schwierigkeit schafft. Ich möchte eine Laufzeitprüfung hinzufügen, die möglicherweise nur in meinen Debug-Builds aufgerufen wird und die die Einschränkung erzwingt, dassT
hat keine verwalteten Typen. Wie kann ich das machen?