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