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);
}