2015-05-08 2 views
4

Я могу использовать операторы класса для строк, используя промежуточную запись холдинга.
Так что я могу так скрывать преобразование встроенных типов.Есть ли способ обхода работы операторов класса для встроенных типов

program TestNewStringHelper; 
{$APPTYPE CONSOLE} 
uses 
    System.SysUtils; 
type 
    TStringRecord = record 
    private 
    Data: string; 
    public 
    class operator Implicit(const a: TStringRecord): Integer; inline; 
    class operator Implicit(const a: string): TStringRecord; inline; 
    end; 

{ TStringRecord } 

class operator TStringRecord.Implicit(const a: string): TStringRecord; 
begin 
    pointer(Result.Data):= pointer(a); 
end; 

class operator TStringRecord.Implicit(const a: TStringRecord): Integer; 
begin 
    Result:= StrToInt(a.Data); 
end; 

var 
    input: TStringRecord; 
    output: integer; 

begin 
    input:= '42'; 
    output:= input; 
    WriteLn(IntToStr(output)); 
    ReadLn; 
end. 

Я хотел бы сделать что-то вроде вместо:

var 
    input: string; 
    output: integer; 

begin 
    input:= '42'; 
    output:= input; //Class operator magic 
    WriteLn(IntToStr(output)); 
    ReadLn; 
end. 

Согласно интерактивной справке:

Примечание: Класс и записи помощники не поддерживают перегрузку операторов.

и http://qc.embarcadero.com/wc/qcmain.aspx?d=72253

Есть обходной путь для достижения неявного преобразования встроенных типов без использования типа посредника?

+1

Вы хотите превратить строго типизированный Delphi в какой-то сумасшедший язык сценариев? :) –

+0

'MyDateTime: = 'Двадцать прошлых полдень''; – Johan

+1

Это звучит как действительно плохая идея ... попытка сделать какой-либо язык более похож на VB6, просто кажется неправильным. –

ответ

4

Помощники по записи и классы - единственный способ расширить область применения существующих типов. И помощники не допускают перегрузки оператора.

Единственный момент, когда вы можете определить операторов перегрузки, определяет тип.

Смежные вопросы