Listing 4

(a)
template<class Src, class Dst>
class Member_Link : public Typed_Link<Src, Dst>
{
  Dst Src::*mptr;
public:
  Member_Link(Dst Src::*_mptr) : mptr(_mptr)
  {}
  Dst &traverse(Src &s)
  {
    return s.*mptr;
  }
  // ...
};


(b)
template<class Src, class Dst, class Get =  
         Dst &(Src::*)(void) const>
class Get_Link : public Typed_Link<Src, Dst>
{
  Get get;
public:
  Dst &traverse(Src &s)
  {
    return (s.*get)();
  }
  // ...
};


(c)
template<class Src, class Dst>
class Array_Link : public Typed_Link<Src, Dst>
{
  unsigned int index;
public:
  Dst &traverse(Src &id) 
  {
    if (index >= sizeof(Src)/sizeof(Dst)) {
      throw Clank(id);
    }
    return id[Index];
  }
  // ...
};