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
bool visit(Last, Last, T *, Visitor &)
{
throw "bummer";
}
template
bool visit(First, Last, T * object, Visitor & v)
{
typedef typename mpl::deref<First>::type type;
type * typed_object = dynamic_cast(object);
if (! typed_object)
detail::visit(
typename mpl::next<First>::type()
, Last()
, object
, v
);
else
v(*typed_object);
}
}
template
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