0

我正在尝试实现类似于访问者模式的东西。

下面当然不是完整的代码,所以你可能想知道代码的动机,但你可以得到与问题相关的结构。

我有以下内容:

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
    }
}

for 的实现visitDerived2非常简单。我需要GetValue使用 int 参数进行调用,然后对其进行处理。如果允许使用虚拟模板功能,我应该做同样visitDerived1的事情,那么我会做以下事情:

template <typename T>
virtual visitDerived1(Base* p)
{
        T val ;
        GetValue(val);
        //Do something with m_val
}

但是模板虚函数不能编译。

一般来说,我看到了一些解决这个问题的方法,但似乎没有一个适合我的情况。

您对此有何建议?

4

0 回答 0