Parameterized methods

Top  Previous  Next

New features since Delphi 7 > Generics > Parameterized methods

 

 

Methods can be declared with type parameters. Parameter types and result types can use type parameters.

 

type

  TFoo = class

    procedure Test;

    procedure CompareAndPrintResult<T>(X, Y: T);

  end;

 

procedure TFoo.CompareAndPrintResult<T>(X, Y: T);

var

  Comparer : IComparer<T>;

begin

  Comparer := TComparer<T>.Default; 

  if Comparer.Compare(X, Y) = 0 then

    WriteLn('Both members compare as equal')

  else

    WriteLn('Members do not compare as equal');

end;

 

procedure TFoo.Test;

begin

  CompareAndPrintResult<String>('Hello', 'World');

  CompareAndPrintResult('Hello', 'Hello');

  CompareAndPrintResult<Integer>(20, 20);

  CompareAndPrintResult(10, 20);

end;

 

procedure Test;

var

  F: TFoo;

begin

  F := TFoo.Create;

  F.Test;

  ReadLn;

  F.Free;

end;

 

->

 

//---------------------------------------------------------------------------

class TFoo : public System::TObject

{

  typedef System::TObject inherited;

public:

  void Test();

    template<typename T> void CompareAndPrintResult(T X, T Y);

public:

  TFoo() {}

  System::TClass ClassType() const;

};

//---------------------------------------------------------------------------

class TFoo : public TObject

{

  typedef TObject inherited;

public:

  void Test();

    template<typename T> void CompareAndPrintResult(T X, T Y);

public:

  TFoo() {}

  System::TClass ClassType() const;

};

//---------------------------------------------------------------------------

class TFooClassRef : public ClassRef<TFoo, TObjectClassRef> { };

TFooClassRef TFooClassRefInstance;

System::TClass TFoo::ClassType() const

{

  return &TFooClassRefInstance;

}

//---------------------------------------------------------------------------

template<typename T> void TFoo::CompareAndPrintResult(T X, T Y)

{

  IComparer<T> Comparer;

  Comparer = TComparer<T>.Default;   //  error

  if(Comparer.Compare(X, Y) == 0)

    WriteLn(L"Both members compare as equal");

  else

    WriteLn(L"Members do not compare as equal");

}

//---------------------------------------------------------------------------

void TFoo::Test()

{

  CompareAndPrintResult<String>(L"Hello", L"World");

  CompareAndPrintResult(L"Hello", L"Hello");

  CompareAndPrintResult<int>(20, 20);

  CompareAndPrintResult(10, 20);

}

//---------------------------------------------------------------------------

void Test()

{

  TFoo* F = nullptr;

  F = new TFoo();

  F->Test();

  System::ReadLn();

  delete F;

}

 

 

The function "TFoo::CompareAndPrintResult doesn't compile. It can be improved in C++Builder with:

 

System::Generics::Defaults::IComparer__1<T> Comparer; // abstract

Comparer = TComparer__1<T>().Default();

 

But the code still doesn't compile, because Comparer is abstract.

 

 

 



This page belongs to the DelphiXE2Cpp11 Documentation

DelphiXE2Cpp11 home  Content