estoy tratando de escribir una propiedad de acceso en caché genérico como el siguiente, pero estoy recibiendo un error de compilación cuando se trata de comprobar si la variable de almacenamiento ya contiene un valor:¿Cómo puedo probar una variable de tipo genérico para igualdad con Predeterminado (T) en Delphi?
function TMyClass.GetProp<T>(var ADataValue: T; const ARetriever: TFunc<T>): T;
begin
if ADataValue = Default(T) then // <-- compiler error on this line
ADataValue := ARetriever();
Result := ADataValue;
end;
El error que estoy recibiendo es " Operador E2015 no aplicable a este tipo de operando ".
¿Debo poner una restricción en T
para que funcione? El archivo de ayuda dice que Default()
aceptaría cualquier cosa excepto los tipos genéricos. En mi caso, trato principalmente con tipos simples como String
, Integer
y TDateTime
.
¿O hay alguna otra función de biblioteca para realizar esta comprobación en particular?
Estoy usando Delphi 2009 en caso de que eso importe.
PD: Sólo en caso de que no está claro a partir del código de lo que estoy tratando de hacer: En mi caso, la determinación de los valores de las propiedades reales podría tomar un tiempo, por diversas razones ya veces ni siquiera podría necesitar ellos en absoluto. Sin embargo, los valores son constantes, así que solo quiero llamar al código que determina el valor real la primera vez que se accede a esa propiedad y luego almacenar el valor en un campo de clase y la próxima vez que se acceda a esa propiedad devuelva el valor almacenado directamente. Aquí está un ejemplo de cómo Tenía la esperanza de ser capaz de utilizar ese código:
type
TMyClass = class
private
FSomeProp: String;
function GetSomeProp: String;
function GetProp<T>(var ADataValue: T; const ARetriever: TFunc<T>): T;
public
property SomeProp read GetSomeProp;
end;
function GetSomeProp: String;
begin
Result := GetProp<String>(FSomeProp,
function: String
begin
Result := SomeSlowOrExpensiveCalculation;
end);
end;
(obviamente, no hay más que una sola propiedad)
+1 buena idea por cierto. – jpfollenius
Probablemente deberías usar un tipo anulable, de lo contrario el código reevaluaría constantemente las propiedades que ya están en la memoria caché pero que tienen el valor predeterminado. Ver por ejemplo http://blogs.embarcadero.com/abauer/2008/09/18/38869 – mghie
@mghie: Buen punto y por lo general estoy de acuerdo, pero en este caso particular, el valor predeterminado siempre se puede interpretar como "sin inicializar" . –