123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- #ifndef QLOW_VISITOR_H
- #define QLOW_VISITOR_H
- namespace qlow
- {
- template<typename R, typename A, typename... T>
- class Visitor;
- template<typename R, typename A>
- class Visitor<R, A>
- {
- public:
- using ReturnType = R;
- };
-
- template<typename R, typename A, typename T>
- class Visitor<R, A, T> :
- public Visitor<R, A>
- {
- public:
- using ReturnType = R;
- virtual R visit(T& arg, A& arg2) = 0;
- };
- template<typename R, typename A, typename T, typename... V>
- class Visitor<R, A, T, V...> :
- public Visitor<R, A, V...>
- {
- public:
- using Visitor<R, A, V...>::visit;
- using ReturnType = R;
- virtual R visit(T& arg, A& arg2) = 0;
- };
- template<typename RT, typename A, typename V>
- class Visitable
- {
- public:
- virtual ~Visitable(void) {}
- virtual RT accept(V& visitor, A& arg2) = 0;
- };
- #if 0
- template<typename... T>
- class Visitor;
- template<>
- class Visitor<>
- {
- public:
- };
-
- template<typename T>
- class Visitor<T> :
- public Visitor<>
- {
- public:
- virtual void visit(T& arg) = 0;
- };
- template<typename T, typename... V>
- class Visitor<T, V...> :
- public Visitor<V...>
- {
- public:
- using Visitor<V...>::visit;
- virtual void visit(T& arg) = 0;
- };
- template<typename VT>
- class VisitableBase
- {
- public:
- template <typename T>
- void accept(T& visitor)
- {
- visitor.visit(static_cast<VT&>(*this));
- }
- };
- #endif
- }
- #endif
|