次の階層について考えてみます。
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メソッドはパラメーターの1つでのみ呼び出されるため、従来のビジターパターンソリューションを使用できません。
私の質問は、この状況で使用できる同様のビジターパターンソリューションまたは同様のものが存在するかどうかです。(Visitを正確に2つのパラメーター、2つ以下でオーバーロードする必要があります)。