Да, строка является нативным типом с добавлением специальной магии компилятора.
Я не знаю, какой оператор перегрузки вы бы хотели. + и = уже работают как операторы конкатенации и равенства.
Однако я думал о том, чтобы сделать что-то подобное сам. Он может работать с типом записи с неявными конверторами и перегруженными операторами добавления и равенства (в Win32 только записи Delphi могут иметь перегрузку операторов. Это доступно только в D2006 (? 2005).)
Я подозреваю, что может быть и некоторое снижение производительности.
Синтаксис будет выглядеть примерно так:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TString = record
private
Value : string;
public
class operator Add(a, b: TString): TString;
class operator Implicit(a: Integer): TString;
class operator Implicit(const s: string): TString;
class operator Implicit(ts: TString): String;
function IndexOf(const SubStr : string) : Integer;
end;
var
Form1: TForm1;
implementation
class operator TString.Add(a, b : TString) : TString;
begin
Result.Value := a.Value + b.Value;
end;
class operator TString.Implicit(a: Integer): TString;
begin
Result.Value := IntToStr(a);
end;
class operator TString.Implicit(ts: TString): String;
begin
Result := ts.Value;
end;
function TString.IndexOf(const SubStr : string) : Integer;
begin
Result := Pos(SubStr, Value);
end;
class operator TString.Implicit(const s: string): TString;
begin
Result.Value := s;
end;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
ts : TString;
begin
ts := '1234';
ShowMessage(ts);
ShowMessage(IntToStr(Ts.IndexOf('2')));
end;
end.
По-видимому, у вас также могут быть "помощники по записи", но я никогда не пробовал сам.