Visitor パターンに似たものを実装しようとしています。
もちろん、以下は完全なコードではないため、コードの動機について疑問に思うかもしれませんが、質問に関連する構造を取得できます。
私は次のものを持っています:
class base
{
public:
GetValue(int &val);
GetValue(char &val);
GetValue(vector<double> &val);
virtual accept(baseVisitor* p){};
};
template <typename T>
Derived1 : public Base
{
public:
GetValue(T &val);
virtual accept(baseVisitor* p)
{
p->visitDerived1();
}
private:
T m_val;
};
Derived2 : public Base
{
GetValue(int &val);
virtual accept(baseVisitor* p)
{
p->visitDerived2();
}
private:
int m_val;
};
class baseVisitor
{
virtual visitDerived1(Base* p);
virtual visitDerived2(Base* p);
}
class DerivedVisitor
{
virtual visitDerived1(Base* p)
{
//Do something with m_val
}
virtual visitDerived2(Base* p)
{
//Do something with m_val
}
}
の実装visitDerived2
は非常に簡単です。int 引数で呼び出しGetValue
てから、何かをする必要があります。仮想テンプレート機能が許可されてvisitDerived1
いれば、次のようにします。
template <typename T>
virtual visitDerived1(Base* p)
{
T val ;
GetValue(val);
//Do something with m_val
}
ただし、テンプレート仮想関数はコンパイルされません。
一般的に、この問題のいくつかの回避策を見ましたが、私の状況に適したものはありませんでした。
そのためにどのような回避策を提案しますか?