0

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
}

ただし、テンプレート仮想関数はコンパイルされません。

一般的に、この問題のいくつかの回避策を見ましたが、私の状況に適したものはありませんでした。

そのためにどのような回避策を提案しますか?

4

0 に答える 0