Ну, вы можете почти сделать это, но вы можете не захотеть.AFAIK, операторы класса работают только с тем классом (или записью), в котором они определены, поэтому и R, и S в вашем коде должны быть TMyRecord.При некотором неуместном использовании неявного приведения мы получаем следующее:
unit Unit2;
interface
type
MyEnum = (value1, value2, value3);
MySet = set of MyEnum;
MyRecord = record
Value: MyEnum;
ValueSet: MySet;
class operator Implicit(A: MyEnum): MyRecord;
class operator Implicit(A: MySet): MyRecord;
class operator In (Left,Right:MyRecord): Boolean;
end;
implementation
class operator MyRecord.Implicit(A: MyEnum): MyRecord;
begin
Result.Value := A;
end;
class operator MyRecord.Implicit(A: MySet): MyRecord;
begin
Result.ValueSet := A;
end;
class operator MyRecord.In(Left, Right: MyRecord): Boolean;
begin
Result:= left.Value in Right.ValueSet;
end;
end.
Теперь скомпилируется и даже сработает следующее:
procedure TForm1.Button1Click(Sender: TObject);
var
R: MyRecord;
S: MyRecord;
begin
R.Value := value1;
S := [value1,value2,value3];
Button1.Caption := BoolToStr(R In S,true);
end;
Что, я уверен, мы все сделаемсогласитесь, гораздо элегантнее, чем «BoolToStr (R.Value в S)».Однако следующее также скомпилирует, но даст неверный результат:
procedure TForm1.Button1Click(Sender: TObject);
var
R: MyRecord;
S: MyRecord;
begin
R.Value := value1;
S := [value1,value2,value3];
Button1.Caption := BoolToStr(S In R,true);
end;
Так что, как прокомментировал Дорин, лучше просто оставить унылое, старое BoolToStr (R.Value в S).Если, конечно, вам платят за строку кода.И бонус за исправление ошибок.