Шаблон посетителя в C++ с несколькими доступными для посещения параметрами

Рассмотрим следующую иерархию:

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 ).

5
задан Heisenbug 6 July 2012 в 15:59
поделиться