Wie kann ich testen, ob ein Typ mit Move sicher kopiert werden kann?

8

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:

%Vor%

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?

    
David Heffernan 13.02.2014, 11:32
quelle

1 Antwort

10

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.

    
whosrdaddy 13.02.2014, 13:39
quelle

Tags und Links