我正在尝试实现类似于访问者模式的内容。
以下不是完整的代码,所以你可能想知道代码的动机,但你可以得到与问题相关的结构。
我有以下内容:
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
}
但模板虚函数无法编译。
我总体上看到了一些解决这个问题的方法,但似乎没有一个适合我的情况。
您对此有何建议?