How do I implement Visitor pattern?

The Visitor pattern is a design pattern that lets you separate algorithms from the objects on which they operate.

This pattern is used when you have a set of classes with differing interfaces and you want to perform operations on these classes.

#include <iostream> // Forward declarations class ConcreteElementA; class ConcreteElementB; // Visitor Interface class Visitor { public: virtual void visit(ConcreteElementA* element) = 0; virtual void visit(ConcreteElementB* element) = 0; }; // Element Interface class Element { public: virtual void accept(Visitor* visitor) = 0; }; // Concrete Elements class ConcreteElementA : public Element { public: void accept(Visitor* visitor) override { visitor->visit(this); } void operationA() { std::cout << "Operation A in ConcreteElementA\n"; } }; class ConcreteElementB : public Element { public: void accept(Visitor* visitor) override { visitor->visit(this); } void operationB() { std::cout << "Operation B in ConcreteElementB\n"; } }; // Concrete Visitor class ConcreteVisitor : public Visitor { public: void visit(ConcreteElementA* element) override { element->operationA(); } void visit(ConcreteElementB* element) override { element->operationB(); } }; // Client Code int main() { ConcreteElementA elementA; ConcreteElementB elementB; ConcreteVisitor visitor; elementA.accept(&visitor); elementB.accept(&visitor); return 0; }

C++ Visitor Pattern Design Patterns Software Design