forked from Lajule/patterns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Visitor.h
44 lines (37 loc) · 888 Bytes
/
Visitor.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#ifndef VISITOR_H
#define VISITOR_H
#include "TypeList.h"
namespace Patterns
{
///////////////////////////////////////////////////////////////////////////
// class template Visitor
// Visitor pattern.
// See:
// Design Patterns (Chapter 3. Behavioral Patterns)
// Modern C++ Design (Chapter 10. Visitor)
///////////////////////////////////////////////////////////////////////////
template <class T>
class Visitor
{
public:
virtual ~Visitor() {}
virtual void Visit(T&) = 0;
};
// partial template specialization for TypeList
template <class Head, class Tail>
class Visitor<TypeList<Head, Tail> > :
public Visitor<Head>,
public Visitor<Tail>
{
public:
using Visitor<Head>::Visit;
using Visitor<Tail>::Visit;
};
template <class Head>
class Visitor<TypeList<Head, End> > : public Visitor<Head>
{
public:
using Visitor<Head>::Visit;
};
}
#endif