fork download
  1. #include <iostream>
  2.  
  3. class DerivedStuff1 {
  4. public:
  5. static void eval() { std::cout << "Evaluating DerivedStuff1\n"; }
  6. };
  7.  
  8. class DerivedStuff2 {
  9. public:
  10. static void eval() { std::cout << "Evaluating DerivedStuff2\n"; }
  11. };
  12.  
  13.  
  14. class DerivedClass1; class DerivedClass2;
  15. class BaseClassVisitor {
  16. public:
  17. virtual void visit(DerivedClass1&) = 0;
  18. virtual void visit(DerivedClass2&) = 0;
  19. };
  20.  
  21. class BaseClass {
  22. public:
  23. virtual void accept(BaseClassVisitor& v) = 0;
  24. };
  25.  
  26. class DerivedClass1 : public BaseClass
  27. {
  28. public:
  29. virtual void accept(BaseClassVisitor& v) { v.visit(*this); }
  30. };
  31.  
  32. class DerivedClass2 : public BaseClass
  33. {
  34. public:
  35. virtual void accept(BaseClassVisitor& v) { v.visit(*this); }
  36. };
  37.  
  38.  
  39. template <typename StuffType>
  40. class EvalVisitor : public BaseClassVisitor
  41. {
  42. virtual void visit(DerivedClass1&) {
  43. std::cout << "We are in DerivedClass1: ";
  44. StuffType::eval();
  45. }
  46. virtual void visit(DerivedClass2&) {
  47. std::cout << "We are in DerivedClass2: ";
  48. StuffType::eval();
  49. }
  50.  
  51. };
  52.  
  53. int main()
  54. {
  55. EvalVisitor<DerivedStuff1> e1;
  56. EvalVisitor<DerivedStuff2> e2;
  57.  
  58. BaseClass* c1 = new DerivedClass1;
  59.  
  60. c1->accept(e1);
  61. c1->accept(e2);
  62.  
  63. BaseClass* c2 = new DerivedClass2;
  64.  
  65. c2->accept(e1);
  66. c2->accept(e2);
  67.  
  68. return 0;
  69. }
  70.  
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
We are in DerivedClass1: Evaluating DerivedStuff1
We are in DerivedClass1: Evaluating DerivedStuff2
We are in DerivedClass2: Evaluating DerivedStuff1
We are in DerivedClass2: Evaluating DerivedStuff2