|
@@ -0,0 +1,86 @@
|
|
|
+#include "../Visitor.h"
|
|
|
+#include <iostream>
|
|
|
+
|
|
|
+using namespace qlow;
|
|
|
+
|
|
|
+
|
|
|
+class Animal;
|
|
|
+class Pig;
|
|
|
+class Cow;
|
|
|
+class Horse;
|
|
|
+
|
|
|
+
|
|
|
+class AnimalVisitor : public Visitor<void, Pig, Cow, Horse>
|
|
|
+// public Visitor<
|
|
|
+// // visitable types
|
|
|
+// Pig, Cow, Horse
|
|
|
+// >
|
|
|
+{
|
|
|
+public:
|
|
|
+
|
|
|
+ void visit(Pig& p) override
|
|
|
+ {
|
|
|
+ std::cout << "Hey Piggy" << std::endl;
|
|
|
+ }
|
|
|
+
|
|
|
+ void visit(Cow& p) override
|
|
|
+ {
|
|
|
+ std::cout << "Hay Cow" << std::endl;
|
|
|
+ }
|
|
|
+
|
|
|
+ void visit(Horse& p) override
|
|
|
+ {
|
|
|
+ std::cout << "Hiy Ross" << std::endl;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+class Animal : public Visitable<AnimalVisitor>
|
|
|
+{
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+class Pig : public Animal
|
|
|
+{
|
|
|
+public:
|
|
|
+ inline void accept(AnimalVisitor& av) final
|
|
|
+ {
|
|
|
+ return av.visit(*this);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+class Cow : public Animal
|
|
|
+{
|
|
|
+public:
|
|
|
+ inline void accept(AnimalVisitor& av) final
|
|
|
+ {
|
|
|
+ return av.visit(*this);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+class Horse : public Animal
|
|
|
+{
|
|
|
+public:
|
|
|
+ inline void accept(AnimalVisitor& av) final
|
|
|
+ {
|
|
|
+ return av.visit(*this);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+int main()
|
|
|
+{
|
|
|
+ Animal* animal = new Pig();
|
|
|
+ AnimalVisitor av;
|
|
|
+
|
|
|
+ animal->accept(av);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|