RTTI に依存せずにリフレクションを実装するために Visitor パターンを使用しています。私の問題は次のとおりです。
同じ BaseItem クラスから派生したさまざまなクラス DerivedItem1、DerivedItem2 などをこの BaseItem クラスにキャストできる Visitor を実装したいと考えています。
基本クラスと派生クラスの 1 つは次のようになります。
class BaseItem : public AbstractItem
{
virtual ~BaseItem(){}
virtual void visit(AbstractVisitor &v)
{
v.handle(*this);
}
}
class DerivedItem1 : public BaseItem
{
virtual ~DerivedItem(){}
virtual void visit(AbstractVisitor &v)
{
v.handle(*this);
}
}
訪問者クラス:
class BaseVisitor : public AbstractVisitor
{
virtual ~BaseVisitor(){}
void handle(BaseItem &item)
{
// <-- stuff to do for all classes derived from BaseItem
}
}
このように BaseVisitor を実装することはできません。これはDerivedItem::visit(BaseVisitor)
、Base クラスに自分自身をキャストせず、BaseVisitor::handle(BaseItem &v)
呼び出されないためです。
次のように、基本クラスとすべての派生クラスをテンプレート パラメーターとして使用して、ビジターをテンプレート クラスとして実装したいと考えています。
template <typename BaseT, typename... DerivedT>
class BaseVisitor : public AbstractVisitor
{
public:
virtual ~BaseVisitor(){}
// unpacking all DerivedT should happen here
// DerivedT_X are the packed template arguments ...DerivedT
void handle(DerivedT_1 &item)
{
// <-- cast item to BaseT, do stuff, return BaseT* to caller
}
void handle(DerivedT_2 &item)
{
// <-- cast item to BaseT, do stuff, return BaseT* to caller
}
};
C++ を使用して、コンパイラがこのメンバー関数を独自に生成できるようにすることは可能ですか?