需要虚拟模板成员解决方法

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的派生类并传递正确的类型/重载来访问,那么你已经死了.

  • 基本上,这是[类型擦除](http://stackoverflow.com/questions/2354210/template-member-function-virtual/2354671#2354671). (3认同)