Возможные реализации для решения конкретных задач
Visitor
Посетитель с приведением типа между базовыми классами
#include <iostream>
#include <vector>
#include <memory>
using namespace std;class AbstractVisitor
{
public:
virtual ~AbstractVisitor() = default;
};template <typename T>
class Visitor
{
public:
virtual ~Visitor() = default;
virtual void visit(const T&) const = 0;
};class Shape
{
public:
Shape() = default;
virtual ~Shape() = default;
virtual void accept(const AbstractVisitor&) const = 0;
};int main()
{
shared_ptr<Shape> figure = make_shared<Figure>(
initializer_list<shared_ptr<Shape>>(
{ make_shared<Circle>(1), make_shared<Square>(2) }
)
);
figure->accept(Draw{});
}Посетитель с использованием шаблона variant ("безопасный" union)
Шаблонный посетитель (Template visitor) с использованием паттерна CRTP (Curiously Recurring Template Pattern)
Last updated