次のような一般的なキャッシュ プロパティ アクセサーを記述しようとしていますが、ストレージ変数に既に値が含まれているかどうかを確認しようとすると、コンパイラ エラーが発生します。
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;
私が得ているエラーは、「E2015 演算子はこのオペランド タイプには適用できません」です。
これを機能させるには、制約を付ける必要がありT
ますか? ヘルプ ファイルには、Default()
ジェネリック型以外は何でも受け入れると書かれています。私の場合、主にString
、 、Integer
などの単純な型を扱っていTDateTime
ます。
または、この特定のチェックを実行するための他のライブラリ関数がありますか?
問題が発生した場合に備えて、Delphi 2009 を使用しています。
PS:コードから何をしようとしているのかが明確でない場合に備えて:私の場合、実際のプロパティ値の決定にはさまざまな理由で時間がかかる場合があり、場合によってはそれらがまったく必要ない場合もあります。ただし、プラス面では、値は一定であるため、そのプロパティが最初にアクセスされたときに実際の値を決定するコードのみを呼び出し、その値をクラス フィールドに格納し、次にそのプロパティにアクセスしたときにキャッシュされた値を返します。直接。これは、そのコードを使用できるようになることを望んでいた方法の例です。
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;
(明らかに、プロパティは 1 つだけではありません)