Tengo el tipo genérico atómico sin restricciones que implementa un inicializador (detalles en mi previous question).Creación de instancia de objeto basada en el tipo genérico no restringido
type
Atomic<T> = class
type TFactory = reference to function: T;
class function Initialize(var storage: T; factory: TFactory): T;
end;
Ahora quiero escribir la función de inicialización que tendría la información de tipo de T (siempre que typeof (T) es tkClass) y crear nueva instancia (si fuera necesario) con el constructor por defecto simplificado.
Lamentablemente, esto no funciona:
class function Atomic<T>.Initialize(var storage: T): T;
begin
if not assigned(PPointer(@storage)^) then begin
if PTypeInfo(TypeInfo(T))^.Kind <> tkClass then
raise Exception.Create('Atomic<T>.Initialize: Unsupported type');
Result := Atomic<T>.Initialize(storage,
function: T
begin
Result := TClass(T).Create; // <-- E2571
end);
end;
end;
compilador informa de error E2571 Type parameter 'T' doesn't have class or interface constraint
.
¿Cómo puedo engañar al compilador para crear una instancia de la clase T?
Gracias, pero el núcleo del problema con la Actualización 2 de XE2 es que TypeInfo (T) no se compilará si T no está marcado con la restricción 'clase'. – gabr
No sabía esto. ¿Es esta una característica o un error? – Linas
No estoy seguro, pero me temo que es una característica. – gabr