fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. class Visitor;
  8.  
  9. class Node
  10. {
  11. public:
  12. vector<Node*> children;
  13. virtual ~Node() = default;
  14. virtual void accept(Visitor&);
  15. };
  16.  
  17. class ANode : public Node
  18. {
  19. public:
  20. virtual void accept(Visitor&);
  21.  
  22. };
  23. class BNode : public Node
  24. {
  25. public:
  26. virtual void accept(Visitor&);
  27. };
  28. class CNode : public Node
  29. {
  30. public:
  31. virtual void accept(Visitor&);
  32. };
  33.  
  34. //-- try inheritance
  35.  
  36. class SubBNode: public BNode
  37. {
  38. public:
  39. virtual void accept(Visitor&);
  40. };
  41.  
  42. //--
  43.  
  44. class Visitor
  45. {
  46. public:
  47. virtual void visit(Node& n);
  48. virtual void visit(ANode& n);
  49. virtual void visit(BNode& n);
  50. virtual void visit(CNode& n);
  51. virtual void visit(SubBNode& n);
  52. };
  53.  
  54.  
  55. //---------------------------------------------
  56.  
  57. void Node::accept(Visitor& v){
  58. cout << __PRETTY_FUNCTION__ << endl;
  59. v.visit(*this);
  60. }
  61. void ANode::accept(Visitor& v){
  62. cout << __PRETTY_FUNCTION__ << endl;
  63. v.visit(*this);
  64. }
  65. void BNode::accept(Visitor& v){
  66. cout << __PRETTY_FUNCTION__ << endl;
  67. v.visit(*this);
  68. }
  69. void CNode::accept(Visitor& v){
  70. cout << __PRETTY_FUNCTION__ << endl;
  71. v.visit(*this);
  72. }
  73. void SubBNode::accept(Visitor& v){
  74. cout << __PRETTY_FUNCTION__ << endl;
  75. v.visit(*this);
  76. }
  77. // -----
  78. void Visitor::visit(Node& n){
  79. cout << __PRETTY_FUNCTION__ << "\t\tDEFAULT" << endl;
  80. }
  81. void Visitor::visit(ANode& n){
  82. cout << __PRETTY_FUNCTION__ << "\t\tDEFAULT" << endl;
  83. }
  84. void Visitor::visit(BNode& n){
  85. cout << __PRETTY_FUNCTION__ << "\t\tDEFAULT" << endl;
  86. }
  87. void Visitor::visit(CNode& n){
  88. cout << __PRETTY_FUNCTION__ << "\t\tDEFAULT" << endl;
  89. }
  90. void Visitor::visit(SubBNode& n){
  91. cout << __PRETTY_FUNCTION__ << "\t\tDEFAULT" << endl;
  92. }
  93.  
  94. template <typename F>
  95. class FunctorVisitor : public Visitor
  96. {
  97. public:
  98. explicit FunctorVisitor(F& f) : f(f) {}
  99.  
  100. virtual void visit(Node& n) override { f(n);}
  101. virtual void visit(ANode& n) override { f(n);}
  102. virtual void visit(BNode& n) override { f(n);}
  103. virtual void visit(CNode& n) override { f(n);}
  104. virtual void visit(SubBNode& n) override { f(n);}
  105. private:
  106. F& f;
  107. };
  108.  
  109.  
  110. class CountVisitor
  111. {
  112. public:
  113. void operator() (const Node& n) const {
  114. cout << __PRETTY_FUNCTION__ << "\t\tDefault" << endl;
  115. }
  116. void operator() (const BNode& n) {
  117. count++;
  118. cout << __PRETTY_FUNCTION__ << "\t\tSPECIAL" << endl;
  119. }
  120.  
  121. int count = 0;
  122. void print() const {
  123. cout << "CountVisitor Found Bs: "<< count << endl;
  124. }
  125. };
  126.  
  127. // ====================================================
  128.  
  129. int main() {
  130. cout << "======FLAT TEST======" << endl;
  131.  
  132. Node n;
  133. ANode a;
  134. BNode b1;
  135. CNode c;
  136. BNode b2;
  137. SubBNode subB;
  138.  
  139. vector<Node*> nodes = { &n, &a, &b1, &c, &b2, &subB };
  140.  
  141. cout << "--DEFAULT--" << endl;
  142. Visitor v1;
  143. for( Node* n : nodes ){
  144. n->accept(v1);
  145. }
  146.  
  147. cout << "--COUNT--" << endl;
  148. CountVisitor cv1;
  149. FunctorVisitor<CountVisitor> d(cv1);
  150. for (Node* n : nodes){
  151. n->accept(d);
  152. }
  153. cv1.print();
  154. }
  155.  
Success #stdin #stdout 0s 16072KB
stdin
Standard input is empty
stdout
======FLAT TEST======
--DEFAULT--
virtual void Node::accept(Visitor&)
virtual void Visitor::visit(Node&)		DEFAULT
virtual void ANode::accept(Visitor&)
virtual void Visitor::visit(ANode&)		DEFAULT
virtual void BNode::accept(Visitor&)
virtual void Visitor::visit(BNode&)		DEFAULT
virtual void CNode::accept(Visitor&)
virtual void Visitor::visit(CNode&)		DEFAULT
virtual void BNode::accept(Visitor&)
virtual void Visitor::visit(BNode&)		DEFAULT
virtual void SubBNode::accept(Visitor&)
virtual void Visitor::visit(SubBNode&)		DEFAULT
--COUNT--
virtual void Node::accept(Visitor&)
void CountVisitor::operator()(const Node&) const		Default
virtual void ANode::accept(Visitor&)
void CountVisitor::operator()(const Node&) const		Default
virtual void BNode::accept(Visitor&)
void CountVisitor::operator()(const BNode&)		SPECIAL
virtual void CNode::accept(Visitor&)
void CountVisitor::operator()(const Node&) const		Default
virtual void BNode::accept(Visitor&)
void CountVisitor::operator()(const BNode&)		SPECIAL
virtual void SubBNode::accept(Visitor&)
void CountVisitor::operator()(const BNode&)		SPECIAL
CountVisitor Found Bs: 3