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;
}
How do I avoid rehashing overhead with std::set in multithreaded code?
How do I find elements with custom comparators with std::set for embedded targets?
How do I erase elements while iterating with std::set for embedded targets?
How do I provide stable iteration order with std::unordered_map for large datasets?
How do I reserve capacity ahead of time with std::unordered_map for large datasets?
How do I erase elements while iterating with std::unordered_map in multithreaded code?
How do I provide stable iteration order with std::map for embedded targets?
How do I provide stable iteration order with std::map in multithreaded code?
How do I avoid rehashing overhead with std::map in performance-sensitive code?
How do I merge two containers efficiently with std::map for embedded targets?