【发布时间】:2011-11-08 03:33:04
【问题描述】:
在 Delphi XE2 中,我试图重载记录上的 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。
如何在MyRecord 上重载In 运算符,以便R in S 在上述代码中计算为True?
【问题讨论】:
-
我不认为你想要达到的目标是可能的......你应该有更好的运气写一个额外的字符 ".Value" => BoolToStr(R.Value in S );并完成它
-
我的问题中的代码只是一个简化的示例。在我的实际应用中,记录类型与集合类型没有一一对应的关系。我最终使用的解决方法是在记录中添加
function InSet(S: MySet): Boolean并使用它而不是in运算符。 -
或许将成员函数改为足够好 -
BoolToStr(R._in(S));
标签: delphi operator-overloading delphi-xe2