2009-02-04 12 views
5

es ist meine erste Frage hier, froh, diese Seite gefunden zu haben.Howto Cast Zeiger auf generische Parametertyp?

Meine Frage befasst sich mit der neuen Generics-Funktion in Delphi 2009. Grundsätzlich habe ich versucht, eine generische Wrapper-Klasse für eine vorhandene Hash-Map-Implementierung zu schreiben. Die vorhandene Implementierung speichert (String, Pointer) Paare, also muss ich in der Wrapper-Klasse zwischen dem generischen Parametertyp T und dem Pointer-Typ und umgekehrt umwandeln.

type THashMap <T : class> = class 
private 
    FHashList : THashList; 
    ... 

end; 

Ich dachte an eine Besetzung wie dieser (Wert: T)

Value := (TObject (Ptr)) as T 

Aber das funktioniert nicht. Der Compiler sagt mir, dass der Operator nicht auf diesen Operandentyp anwendbar ist.

Jemand hat ein paar Hinweise? Vielen Dank im Voraus.

Antwort

10

Sie müssen die Adresse der Position des generischen Typ-Parametertyps nehmen, dann typecast diese Adresse auf einen Zeiger auf den gewünschten Typ, und dann den Zeiger dieser Wert dereferenzieren und int zuweisen o der resultierende Standort Zum Beispiel:

PObject(@Value)^ := Ptr; 

Der Grund, warum Sie nicht nur einen Wert vom Typ T typisieren können, wobei T ungezwungen ist, ist, dass der Compiler nicht die Größe von T nicht kennt; Normalerweise können nicht numerische Typumwandlungen nur Werte in Typen mit derselben Größe konvertieren.

Leider ist der Compiler nicht schlau genug, um herauszufinden, dass eine Klassenbeschränkung bedeutet, dass T garantiert die gleiche Größe wie ein Zeiger hat.

Außerdem gibt es ein Problem mit aktuellen Generika von Delphi 2009 mit der Erstellung von Zeigern auf Typen-Parametertypen. Generisches Zeiger wird vom Compiler nicht unterstützt, aber der Compiler dies zulässt Syntax innerhalb von Klassen:

type 
    C<T> = class 
    type 
    PT = ^T; // UNSUPPORTED! 
    end; 

Dies kann für bestimmte Szenarien arbeiten - und kann für Ihr spezielles Problem hilfreich sein - aber es funktioniert nur durch Zufall und ist nicht allgemein unterstützt. Benutzung auf eigene Gefahr.

0

Try this:

Value := TObject (Ptr) 

Keine Notwendigkeit mehr zu werfen, wie die TObject den Oberklassentyp Variablen zugewiesen ist gültig :)

Aber ich weiß nicht, den Grund, warum Sie nicht T verwenden können zum Gießen an erster Stelle ...

Verwandte Themen