$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2007-05-24 17:50:37
Rereading my quick post from yesterday I notice:
The visit facility could be generalized further to deduce the base type, 
so 'visit' is not limited to 'ast::node' arguments.
We can also change the interface of 'visit' to hide all the pointers 
from the user (taking a reference instead and applying boost::addressof 
in case operator& is overloaded):
   namespace detail
   {
       template <class Last, class T, class Visitor>
       bool visit(Last, Last, T *, Visitor &)
       {
           throw "bummer";
       }
       template <class First, class Last, class T, class Visitor>
       bool visit(First, Last, T * object, Visitor & v)
       {
           typedef typename mpl::deref<First>::type type;
           type * typed_object = dynamic_cast<type *>(object);
           if (! typed_object)
               detail::visit(
                   typename mpl::next<First>::type()
                 , Last()
                 , object
                 , v
               );
           else
               v(*typed_object);
       }
   }
   template<class T, class Visitor>
   bool visit(T & object, Visitor & with_visitor)
   {
       typedef typename Visitor::accepted_types seq;
       return detail::visit(
           typename mpl::begin<seq>::type()
         , typename mpl::end<seq>::type()
         , boost::addressof(object)
         , with_visitor
       );
   }
Regards,
Tobias