Delphi 'in' 集合上的运算符重载

标签 delphi operator-overloading delphi-xe2

在 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,编译器会说:不兼容的类型MyRecordMyEnum

如何重载 MyRecord 上的 In 运算符,以便 R in S 的计算结果为 True上面的代码?

最佳答案

要使 in 运算符起作用,正确的操作数必须是记录类型,因为它是集合运算符而不是二元运算符。在您的情况下,它是左操作数。

因此以下内容将起作用:

type
  MyRecord = record
    Value: MyEnum;
    class operator In(const A: MyRecord; const B: MySet): Boolean;
  end;

  MyRecord2 = record
    Value: MySet;
    class operator In(const A: MyRecord; const B: MyRecord2): Boolean;
    class operator In(const A: MyEnum; const B: MyRecord2): Boolean;
  end;

class operator MyRecord.In(const A: MyRecord; const B: MySet): Boolean;
begin
  Result := A.Value in B;
end;

class operator MyRecord2.In(const A: MyRecord; const B: MyRecord2): Boolean;
begin
  Result := A.Value in B.Value;
end;

class operator MyRecord2.In(const A: MyEnum; const B: MyRecord2): Boolean;
begin
  Result := A in B.Value;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  R: MyRecord;
  R2: MyRecord2;
begin
  R.Value := value1;
  R2.Value := [value1, value2];

  if R in R2 then;
  if value1 in R2 then;
end;

关于Delphi 'in' 集合上的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8045635/

相关文章:

ios - Delphi 在链接后从编译文件夹中删除 iOS64 二进制文件

Delphi 2010 或 2007 用于升级 Delphi 3 项目?

python - 如何覆盖 Python 中的 [] 运算符?

c++ - 前向声明模板类时无效使用不完整类型

xcode - Delphi XE2 FireMonkey Xcode安装问题

delphi - Delphi 的免费 dbexpress 驱动程序列表

delphi - 在后台 (kibitz) 编译器中跳过源代码

c++ - 在 C++ 中使用友元函数进行运算符重载

delphi - 将 TArray<X> 类型转换为 X 数组是否安全?

delphi-xe2 - Indy 10 TidTCPServer编码字符