Ich schreibe einen generischen Typ:
%Vor%Ich möchte dann Klassen wie folgt ableiten:
%Vor% Ich muss Klassen ableiten, weil ich arithmetische Operationen im generischen Typ nicht implementieren kann. Das liegt daran, dass generische Constraints nicht reich genug sind, um T
so zu beschränken, dass sie die erforderlichen arithmetischen Operationen unterstützt. Grr!
Wie auch immer, genug davon. Meine Frage betrifft die Implementierung von Zeroise
und ToArray
. Aus Leistungsgründen möchte ich Raw-Speicheroperationen verwenden. Zum Beispiel könnte Zeroise
sein:
Nun, mir geht es gut mit Typen wie Double
und meinem maßgeschneiderten Complex
-Typ. Ich weiß, dass sie nicht verwaltet werden und eine rohe Speicherkopie schafft keine Schwierigkeiten. Ich möchte eine Laufzeitprüfung hinzufügen, die möglicherweise nur in meinen Debug-Builds aufgerufen wird und die Einschränkung erzwingt, dass T
keine verwalteten Typen hat. Wie kann ich das tun?
Ich würde es so machen:
%Vor% TObject
für Nicht-ARC-Plattformen wird nicht verwaltet, daher ist die Verwendung ManagedFldCount
hier gültig.
AKTUALISIEREN
Wie David herausfand, können Sie in neueren Delphi-Versionen (Lesen: ab D2010) die Rtti.IsManaged Funktion.
Der Code würde so aussehen:
%Vor% UPDATE 2
Ab XE7 können Sie die intrinsische Funktion System.IsManagedType(T)
verwenden. Dies wird zur Kompilierungszeit aufgelöst, was zu keinem Runtime-Overhead führt.
wenn IsManagedType (T) dann Assert (false, 'T am besten kein verwalteter Typ' ist);
Führen Sie Assert(not(IsManagedType(T))
nicht aus, da der Compiler das Assert nicht entfernen kann, aber% ce_de% wird entfernt, wenn es nicht zutrifft.
Tags und Links delphi