Рассмотрим следующую иерархию:
class Base
{
virtual void Method() = 0;
virtual void Accept(Visitor *iVisitor) = 0;
};
class Derived1: public Base
{
virtual void Method(){//impl}
virtual void Accept(Visitor *iVisitor)
{
iVisitor->Visit(this);
}
};
class Derived2: public Base
{
virtual void Method(){//impl}
virtual void Accept(Visitor *iVisitor)
{
iVisitor->Visit(this);
}
};
и класс посетителей:
class VisitorInterface
{
virtual void Visit(Derived1 * param);
virtual void Visit(Derived2 * param);
}
class Visitor: public VisitorInterface
{
void Visit(Derived1 * param){}
void Visit(Derived2 * param){}
}
Обычно я использую шаблон посетителя для двойной диспетчеризации, когда метод перегрузки зависит от типа параметра, но у меня есть только указатель на базовый класс.
Например:
void foo(Visitor *visitorPtr, Base * basePtr)
{
basePtr->Accept(visitorPtr);
}
Я думаю, что это единственный способ добиться двойной диспетчеризации, поскольку динамическая привязка виртуальных функций должна происходить только к объекту, для которого вызывается метод, а не к его параметрам (производным типам ).
Теперь я столкнулся с новой ситуацией, когда мне нужно что-то вроде перегрузки метода Visit по нескольким параметрам. Примерно так:
class VisitorInterfaceMultiple
{
virtual void Visit(Derived1 * param1, Derived2 * param2);
virtual void Visit(Derived2 * param1, Derived3 *param2);
}
Я не могу использовать классическое решение шаблона посетителя, потому что метод accept вызывается только для одного из параметров.
Мой вопрос: :существует ли какое-либо похожее решение шаблона посетителя или что-то подобное, которое я мог бы использовать в этой ситуации? (Мне нужно перегрузить Визит ровно 2 параметрами, не более 2 ).