i yet didn't test for recursions - but is this valid code?   
   ================================================================   
   #include    
      
   template    
   void   
   exec2(   
    CALLER & caller)   
   {   
    struct Me : public CALLER   
    {   
    public:   
    Me(CALLER & caller)   
    : CALLER(caller)   
    { };   
      
    Me(Me const & me)   
    : CALLER(me)   
    { };   
      
    void   
    exec()   
    {   
    std::cerr << "exec2::Me::exec(): invoked" << std::endl;   
    std::cerr << "exec2::Me::exec(): this->y = " << this->y << std::endl;   
    std::cerr << "exec2::Me::exec(): this->x = " << this->x << " (before   
   update)" << std::endl;   
    this->x = 7;   
    std::cerr << "exec2::Me::exec(): this->x = " << this->x << " (after   
   update)" << std::endl;   
    this->logSomething();   
    }   
    } me(caller);   
      
    return me.exec();   
   }   
      
   template    
   void   
   exec1(   
    CALLER & caller)   
   {   
    struct Me : public CALLER   
    {   
    private:   
    int _y = 42;   
    public:   
    int &y; // reference to pass on for the call levels   
      
    Me(Me const & me)   
    : CALLER(me),   
    y(me.y)   
    { };   
      
    Me(CALLER & caller)   
    : CALLER(caller),   
    y(_y)   
    { };   
      
    void   
    exec()   
    {   
    std::cerr << "exec1::Me::exec(): invoked" << std::endl;   
    std::cerr << "exec1::Me::exec(): caller.x = " << this->x << std::endl;   
    exec2(*this);   
    std::cerr << "exec1::Me::exec(): caller.x = " << this->x << std::endl;   
    }   
      
    void logSomething()   
    {   
    CALLER::logSomething();   
    std::cerr << "hello, world again!" << std::endl;   
    }   
    } me(caller);   
      
    std::cerr << "exec1::me = " << (long)&me << std::endl;   
      
    return me.exec();   
   }   
      
   int   
   main(   
    int,   
    char**)   
   {   
    struct Me   
    {   
    private:   
    int _x = 5;   
    public:   
    int &x; // reference to pass on for the call levels   
      
    Me()   
    : x(_x)   
    { };   
      
    Me(Me const & me)   
    : x(me.x)   
    { }   
      
    void   
    exec()   
    {   
    return exec1(*this);   
    }   
      
    void logSomething()   
    {   
    std::cerr << "hello, world!" << std::endl;   
    }   
    } me;   
      
    std::cerr << "main::me = " << (long)&me << std::endl;   
    std::cerr << "main::Me::x = " << me.x << " (before me.exec(me))" << std::endl;   
    me.exec();   
    std::cerr << "main::Me::x = " << me.x << " (after me.exec(me))" << std::endl;   
      
    return 0;   
      
   }   
      
      
   --   
    [ See http://www.gotw.ca/resources/clcm.htm for info about ]   
    [ comp.lang.c++.moderated. First time posters: Do this! ]   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|