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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage