[ create a new paste ] login | about

Link: http://codepad.org/RjBdzVAh    [ raw code | output | fork ]

Abyx - C++, pasted on Jun 6:
struct visitor;

struct node
{
   virtual void accept(visitor* v) = 0;
};

struct some : node
{
   virtual void accept(visitor* v);
};

struct other : node
{
   virtual void accept(visitor* v);
};

// visitor.h

struct visitor
{
   virtual void visit(some&) = 0;
   virtual void visit(other&) = 0;
};

template<class Vis>
inline void apply_visitor(Vis& vis, node* n)
{
   struct visitor_impl : visitor
   {
      virtual void visit(some& n) { vis(n); }
      virtual void visit(other& n) { vis(n); }

      visitor_impl(Vis& vis) : vis(vis) {}
      Vis& vis;
   };

   visitor_impl impl(vis);
   n->accept(&impl);
}

void some::accept(visitor* v) { v->visit(*this); } // it may be something like "v->visit(*this); this->childNodeN->accept(v); ..."
void other::accept(visitor* v) { v->visit(*this); }

// ----

struct test_visitor
{
   void operator()(some&) { std::cout << "some visited\n"; }
   void operator()(other&) { std::cout << "other visited\n"; }
   template<class T> void operator()(T&) { std::cout << "i-dunno-what visited\n"; }
};

int main()
{
   some o;
   node* n = &o;

   test_visitor vis;
   apply_visitor(vis, n);
}


Output:
1
some visited


Create a new paste based on this one


Comments: