yur*_*rib 18 c++ virtual templates visitor
我需要编写一个实现访问者设计模式的程序.问题是基本访问者类是模板类.这意味着BaseVisited :: accept()将模板类作为参数,因为它使用'this'并且我需要'this'指向对象的正确运行时实例,它也需要是虚拟的.
我想知道是否有任何解决这个问题的办法.
template <typename T>
class BaseVisitor {
public:
BaseVisitor();
T visit(BaseVisited *visited);
virtual ~BaseVisitor();
}
class BaseVisited {
BaseVisited();
template <typename T>
virtual void accept(BaseVisitor<T> *visitor) { visitor->visit(this); }; // problem
virtual ~BaseVisited();
}
Run Code Online (Sandbox Code Playgroud)
Pup*_*ppy 17
你应该做的是分离BaseVisitor.
class BaseVisited;
class BaseVisitorInternal {
public:
virtual void visit(BaseVisited*) = 0;
virtual ~BaseVisitorInternal() {}
};
class BaseVisited {
BaseVisited();
virtual void accept(BaseVisitorInternal* visitor) { visitor->visit(this); }
};
template<typename T> class BaseVisitor : public BaseVisitorInternal {
void visit(BaseVisited* visited);
};
Run Code Online (Sandbox Code Playgroud)
如果你也需要模仿BaseVisited的派生类并传递正确的类型/重载来访问,那么你已经死了.