Nested routines with C++11

Top  Previous  Next

What is translated > Routines > Nested routines > Nested routines with C++11

There aren't nested functions in C++, but they can be simulated by use of C++11 lambda-functions.

 

 

type

TNested = class

public

  iClassVar : Integer;

  function Test(iOuterParam, iTwiceParam : Integer; s : String): Integer;

end;

 

implementation

 

function TNested.Test(iOuterParam, iTwiceParam : Integer; s : String): Integer;

const

  cSeparate = ':';

var

 iFunctionVar : Integer;

 

 procedure NestedTest(iInnerParam, iTwiceParam : Integer);

 begin

   result := iClassVar + iOuterParam + iFunctionVar + iInnerParam + iTwiceParam;

 end;

 

begin

 iClassVar := 1;

 iFunctionVar := 2;

 NestedTest1(3, 4);

 result := result + iTwiceParam;

end;

 

->

 

class TNested : public System::TObject

{

  typedef System::TObject inherited;

public:

  int iClassVar;

  int Test(int iOuterParam, int iTwiceParam, System::String s);

  void InitMembers(){iClassVar = 0;}

public:

  TNested() {InitMembers();}

};

 

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

int TNested::Test(int iOuterParam, int iTwiceParam, String s)

{

  int result = 0;

  const DWideChar cSeparate = _T(':');

  int iFunctionVar = 0;

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

  auto NestedTest = [&](int iInnerParam, int iTwiceParam) -> void 

  {

    result = iClassVar + iOuterParam + iFunctionVar + iInnerParam + iTwiceParam;

  };

  iClassVar = 1;

  iFunctionVar = 2;

  NestedTest1(3, 4);

  result = result + iTwiceParam;

  return result;

}

 

Like nested routines in Delphi lambda functions can access variables from the outer scope. The capture clause [&] ensures that access is via reference.

 

In the special case, that a sub-routine is called reflexively, the auto variable cannot be used. (VisualC produces the error C2064: term does not evaluate to a function taking N arguments. "The expression does not evaluate to a pointer to a function"). DelphiXE2C11 generates an explicit forward declaration in such cases. For example:

 

  function nested : boolean;

 

    function nested_reflexive(depth :Integer) : boolean;

    begin

      if depth = 2 then

        result := true

       else

        result := nested_reflexive(depth + 1);

    end;

 

  

  begin

    result := nested_reflexive(0);

  end;

 

->

 

function<bool (int)> nested_reflexive;

 

 

bool __fastcall nested()

{

  bool result = false;

 

  nested_reflexive = [&](int depth) -> bool 

  {

    bool result = false;

    if(depth == 2)

      result = true;

    else

      result = nested_reflexive(depth + 1);

    return result;

  };

  result = nested_reflexive(0);

  return result;

}

 

This compiles and works well.

 



This page belongs to the DelphiXE2Cpp11 Documentation

DelphiXE2Cpp11 home  Content