Para ello, tiene que declarar un tipo de puntero como un tipo anidado en la clase genérica:
type
TMyGeneric<T> = class
type
P = ^T;
public
procedure DoStuff(tPtr: P);
end;
Y si quieres un método de clase (es decir, no un método de instancia), puede hacerlo de esta manera :
type
TMyGeneric<T> = record
type
P = ^T;
public
class procedure DoStuff(tPtr: P); static;
end;
var
int: Integer;
...
TMyGeneric<Integer>.DoStuff(@int);
O usando un parámetro var:
type
TMyGeneric<T> = record
public
class procedure DoStuff(var a: T); static;
end;
parece que es común el uso de recor ds en lugar de clases para tipos genéricos que nunca se crean instancias.
Por último, no se puede tener, en Delphi, un método genérico sin hacer que la clase sea genérica. En otras palabras, no hay análogo del siguiente código C++ plantilla:
respuesta de Thorsten muestra cómo implementar un método genérico sin hacer la clase genérica, que es el análogo de Delphi de la siguiente C código de la plantilla ++:
class C {
public:
template <typename T>
int SomeTemplateFunction(T* data) {
printf("Address of parameter is %p\n", data);
return 0;
}
};
int a;
char c;
C cinst;
cinst.SomeTemplateFunction<int>(&a);
cinst.SomeTemplateFunction<char>(&c);
La respuesta de Thorsten le da una función de clase, pero en los comentarios indica que está buscando una función de miembro normal.
type
TMyClass = class
public
procedure DoStuff<T>(var a: T);
end;
procedure TMyClass.DoStuff<T>(var a: T);
begin
end;
...
var
instance: TMyClass;
i: Integer;
s: string;
...
instance.DoStuff<Integer>(i);
instance.DoStuff<string>(s);
Sin embargo, lo que estoy luchando con es exactamente cómo se podía hacer nada muy útil con esto, en Delphi, que no se podía hacer con la misma eficacia y sin una solución genérica.
Agradecería cualquier sugerencia y estaría encantado de editar la respuesta para acomodarlos.
@ David: ¿Estás seguro de que es la única manera? La única razón por la que hice de la función una función de clase es para poder usar genéricos, y no quiero que el usuario de la clase cree una nueva instancia de la clase para cada tipo diferente con el que quiera usar la función. De hecho, un requisito es que el usuario pueda usar la misma función con diferentes parámetros de tipo en la misma instancia de una clase. Si esta es realmente la única manera, es una limitación que deja alucinada a Delphi. – Hal
@David Tengo otra instancia de este problema donde no puede ser un método de clase. Por favor responde mi pregunta en el comentario anterior. – Hal
@Hal lo he respondido. Nunca tendría una instancia del tipo genérico en la sección del segundo código de la respuesta actualizada. Usted simplemente lo llama 'MyGeneric .DoStuff (@int);' Es un poco prolijo, pero así es como lo hace. –