2009-02-04 13 views
5

es mi primera pregunta aquí, me alegro de haber encontrado este sitio.¿Cómo convertir el puntero al tipo de parámetro genérico?

Mi pregunta se refiere a la nueva característica Genéricos en Delphi 2009. Básicamente traté de escribir una clase contenedora genérica para una implementación de mapa hash existente. La implementación existente almacena pares (String, Pointer), por lo que en la clase contenedora tengo que convertir el tipo de parámetro genérico T y el tipo de puntero y viceversa.

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

end; 

pensé en un molde como este (Valor: T)

Value := (TObject (Ptr)) as T 

Pero esto no funciona. El compilador me dice 'Operador no aplicable a este tipo de operando'.

¿Alguien tiene algunas pistas? Muchas gracias por adelantado.

Respuesta

10

Debe tomar la dirección de la ubicación del tipo de parámetro de tipo genérico, luego encasillar esta dirección en un puntero al tipo deseado, y luego desreferenciar este puntero y asignar int o la ubicación resultante. Por ejemplo:

PObject(@Value)^ := Ptr; 

La razón por la que no sólo puede encasillarse un valor de tipo T, donde T es ilimitada, es que el compilador no sabe el tamaño de T; normalmente, las transmisiones de tipos no numéricas solo pueden convertir valores en tipos que son del mismo tamaño.

Desafortunadamente, el compilador no es lo suficientemente inteligente como para darse cuenta de que una restricción de tipo de clase significa que T garantiza que tiene el mismo tamaño que un puntero.

Además, existe un problema con los genéricos Delphi 2009 actuales con la creación de punteros para escribir tipos de parámetros. punteros genéricos no son compatibles con el compilador, pero los permisos del compilador esta sintaxis dentro de las clases:

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

Esto puede funcionar para ciertos escenarios - y puede ser útil para su problema específico - pero sólo funciona por accidente y no es generalmente apoyado. Úselo bajo su propio riesgo.

0

Prueba esto:

Value := TObject (Ptr) 

No hay necesidad de emitir más, como la asignación de la TObject a la variable tipo de clase genérica es válida :)

Pero no sé la razón por la que no se puede utilizar T para el casting en primer lugar ...

Cuestiones relacionadas