Значение параметра по умолчанию для TSomething в Delphi

Я хотел бы знать, возможно ли это в Delphi (или есть ли чистый способ обойти это):

type
 TSomething = record
  X, Y : Integer;
 end;

GetSomething( x, y ) -> Возвращает запись с этими значениями.

... и затем у вас есть эта функция с TSomething в качестве параметра, и вы хотите использовать ее по умолчанию как

function Foo( Something : TSomething = GetSomething( 1, 3 );

Компилятор выдает здесь ошибку, однако я не уверен, что есть способ ее обойти!

Можно ли это сделать?


person deluvas    schedule 20.09.2010    source источник


Ответы (4)


Самый простой способ - использовать перегруженные процедуры:

program TestOverloading;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TSomething = record
    X,Y : integer;
  end;

const
  cDefaultSomething : TSomething = (X:100; Y:200);

procedure Foo(aSomething : TSomething); overload;
begin
  writeln('X:',aSomething.X);
  writeln('Y:',aSomething.Y);
end;

procedure Foo; overload;
begin
  Foo(cDefaultSomething);
end;

begin
  Foo;
  readln;
end.
person Svein Bringsli    schedule 20.09.2010

Используйте перегрузку:

procedure Foo(const ASomething: TSomething); overload;
begin
  // do something with ASomething
end;

procedure Foo; overload;
begin
  Foo(GetSomething(1, 3));
end;
person Uli Gerhardt    schedule 20.09.2010

Используйте класс вместо записи, и что-нибудь сделает это:

TSomething = class
public 
  X: integer;
  Y: integer
end;

procedure Foo(Something: TSomething = nil);
begin
  if (Something = nil) then
    Something := GetSomething(1, 3);
  ...
end;
person splash    schedule 20.09.2010
comment
Чтобы исключить некоторые накладные расходы RTTI, X и Y могут быть объявлены как «общедоступные» вместо неявного «опубликованного». - person mjn; 20.09.2010
comment
Спасибо @mjustin за указание на это. Мое неявное предположение заключалось в том, что директива для управления генерацией RTTI имеет значение по умолчанию: {$M-}. ;-) - person splash; 20.09.2010

Если вы используете указатель вместо типа записи, вы можете использовать nil в качестве значения по умолчанию:

type
  TSomething = record
    X, Y : Integer;
  end;

  PSomething = ^TSomething;

function Foo(Something: PSomething = nil);

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

person Rafael Piccolo    schedule 21.05.2013