Delphi XE2では、レコードで表される値がセットの一部であるかどうかを確認できるようにレコードにin
演算子をオーバーロードしようとしています。私のコードは次のようになります:Delphi 'in'演算子オーバーロードセット
type
MyEnum = (value1, value2, value3);
MySet = set of MyEnum;
MyRecord = record
Value: MyEnum;
class operator In(const A: MyRecord; B: MySet): Boolean;
end;
class operator MyRecord.In(const A: MyRecord; B: MySet): Boolean;
begin
Result := A.Value in B;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
R: MyRecord;
S: MySet;
begin
R.Value := value1;
S := [value1, value2];
Button1.Caption := BoolToStr(R in S);
end;
コードがコンパイルに失敗します。ステートメントR in S
の場合、コンパイラーは、互換性のないタイプMyRecord
とMyEnum
と言っています。 R in S
は、上記のコードでTrue
に評価されるように
にはどうすればMyRecord
にIn
演算子をオーバーロードすることができますか?
私はあなたが達成しようとしていることは可能ではないと思っています...あなたは余分な文字 ".Value" => BoolToStr(R.Value in S)とそれで完了する – ComputerSaysNo
私の質問のコードは、単純なサンプルです。実際のアプリケーションでは、レコードタイプはセットタイプと1対1で対応していません。私が使い終わった回避策は 'InSet(S:MySet):Boolean'関数をレコードに追加し、' in'演算子の代わりにそれを使うことでした。 –
多分、メンバー関数を作るのに十分なのではないでしょうか? 'BoolToStr(R._in(S));' –