fork download
  1. #include <iostream>
  2. class Visitor;
  3.  
  4. class Element{
  5. public :
  6. virtual void Accept(Visitor&) = 0;
  7. protected :
  8. Element() {};
  9. int num;
  10. };
  11.  
  12. class Visitor {
  13. public:
  14. void Visit(Element* pe) { std::cout << getNum(pe) << '\n'; }
  15. int getNum(Element* pe)
  16. {
  17. struct ElementNumAccessor : private Element
  18. {
  19. ElementNumAccessor(Element const& e) : Element(e) {}
  20. int getNum() { return num; }
  21.  
  22. void Accept(Visitor&);
  23. };
  24.  
  25. ElementNumAccessor ea(*pe);
  26. return ea.getNum();
  27. }
  28. };
  29.  
  30.  
  31. class ElementA : public Element{
  32. public : ElementA() { num = 5; };
  33. void Accept(Visitor& v) {v.Visit(this);}
  34. };
  35.  
  36. class ElementB : public Element{
  37. public : ElementB() { num = 6; };
  38. void Accept(Visitor& v) {v.Visit(this);}
  39. };
  40.  
  41.  
  42. int main()
  43. {
  44. ElementA ea;
  45. ElementB eb;
  46. Visitor v;
  47. ea.Accept(v);
  48. eb.Accept(v);
  49.  
  50. }
Success #stdin #stdout 0s 2896KB
stdin
Standard input is empty
stdout
5
6