Skip to content

Instantly share code, notes, and snippets.

@max-dark
Created August 11, 2017 17:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save max-dark/e6cd793fad0b5f575dff47ae6663348b to your computer and use it in GitHub Desktop.
Save max-dark/e6cd793fad0b5f575dff47ae6663348b to your computer and use it in GitHub Desktop.
Visitor pattern example
// https://en.wikipedia.org/wiki/Visitor_pattern
#include <iostream>
#include <memory>
class A;
class B;
class C;
struct Visitor
{
public:
virtual void visit(A&) = 0;
virtual void visit(B&) = 0;
virtual void visit(C&) = 0;
virtual ~Visitor();
};
struct Visitable
{
public:
virtual void accept(Visitor&) = 0;
virtual ~Visitable();
};
class A: public Visitable
{
public:
void accept(Visitor& v) override;
};
class B: public Visitable
{
public:
void accept(Visitor& v) override;
};
class C: public Visitable
{
public:
void accept(Visitor& v) override;
};
class PrintVisitor: public Visitor
{
public:
void visit(A&) override;
void visit(B&) override;
void visit(C&) override;
};
int main()
{
std::unique_ptr<Visitable> data[] = {
std::make_unique<A>(),
std::make_unique<B>(),
std::make_unique<C>()
};
PrintVisitor printer;
for(auto& i: data){
i->accept(printer);
}
return 0;
}
Visitable::~Visitable()
{
;
}
Visitor::~Visitor()
{
}
void PrintVisitor::visit(A &)
{
std::cout << "operation for class A" << std::endl;
}
void PrintVisitor::visit(B &)
{
std::cout << "operation for class B" << std::endl;
}
void PrintVisitor::visit(C &)
{
std::cout << "operation for class C" << std::endl;
}
void A::accept(Visitor &v)
{
v.visit(*this);
}
void B::accept(Visitor &v)
{
v.visit(*this);
}
void C::accept(Visitor &v)
{
v.visit(*this);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment