32#ifndef BERTINI_DETAIL_VISITABLE_HPP
33#define BERTINI_DETAIL_VISITABLE_HPP
49 template<
class VisitedT,
typename RetT>
52 static RetT OnUnknownVisitor(VisitedT&a,
VisitorBase&)
54 std::cout <<
"unknown visitor: " << a <<
" of type " <<
typeid(VisitedT).name() <<
". Make sure you've added it in all three places! two in the class definition (type inheritance listing as visiting, and virtual function declaration), and one in cpp source (function definition)." << std::endl;
59 template<
class VisitedT,
typename RetT>
60 struct RaiseExceptionWithTypeNamesInMessage
62 static RetT OnUnknownVisitor(VisitedT&a,
VisitorBase&)
64 std::stringstream err_msg;
65 err_msg <<
"unknown visitor: " << a <<
" of type " <<
typeid(VisitedT).name() <<
". Make sure you've added it in all three places! two in the class definition (type inheritance listing as visiting, and virtual function declaration), and one in cpp source (function definition)." << std::endl;
66 throw std::runtime_error(err_msg.str());
72 template<
class VisitedT,
typename RetT>
90 typedef RetT VisitReturnType;
110 if (
auto p =
dynamic_cast<Visitor<T>*
>(&guest))
111 return p->Visit(visited);
113 return CatchAll<T,RetT>::OnUnknownVisitor(visited, guest);
121 #define BERTINI_DEFAULT_VISITABLE() \
122 virtual VisitReturnType Accept(VisitorBase& guest) override \
123 { return AcceptBase(*this, guest); }
The base class for visitable types.
Definition visitable.hpp:88
static VisitReturnType AcceptBase(T &visited, VisitorBase &guest)
Abstract method for how to accept a visitor.
Definition visitable.hpp:108
A strawman class for implementing the visitor pattern.
Definition visitor.hpp:46
The first non-trivial visitor class.
Definition visitor.hpp:62
Contains the detail/events base types.
A policy for what to do when a visited type is encoutered by a visitor it doesn't know.
Definition visitable.hpp:51
RaiseExceptionWithTypeNamesInMessage< VisitedT, RetT > DefaultCatchAll
Definition visitable.hpp:73
Contains the visitor base types.