C++ 虚拟访客

C++ 虚拟访客,c++,visitor,C++,Visitor,我有一个类的层次结构(Base和daugthersa,B,C等等)。层次结构树不是有限的。可以使用众所周知的访问者模式访问Base*,以便动态地适应Base*的动态类型。访问者有一个类型,如BaseVisitor。像这样: struct BaseVisitor; struct Base { virtual void accept(BaseVisitor &v) = 0; }; struct A : Base { int a; A(int x) : a(x) {} ~

我有一个类的层次结构(
Base
和daugthers
a
B
C
等等)。层次结构树不是有限的。可以使用众所周知的访问者模式访问
Base*
,以便动态地适应
Base*
的动态类型。访问者有一个类型,如
BaseVisitor
。像这样:

struct BaseVisitor;

struct Base {
  virtual void accept(BaseVisitor &v) = 0;
};

struct A : Base {
  int a;

  A(int x) : a(x) {}
  ~A(void) = default;

  void accept(BaseVisitor &v) override {
    v->visit(*this);
  }
};

struct B : Base {
  float b;

  B(void) : b(314.f) {}
  ~B(void) = default;

  void accept(BaseVisitor &v) override {
    v->visit(*this);
  }
};

struct BaseVisitor {
  void visit(Base &) {}

  void visit(A &a) {
    std::cout << "just visited a A; a=" << a.a << std::endl;
  }

  void visit(B &b) {
    std::cout << "just visited a B; b=" << b.b << std::endl;
  }
};

你有什么想法吗?

为什么不把
BaseVisitor
抽象化为
visit(A&)=0
visit(B&)=0
?问题是层次结构树不是有限的(更新帖子),你的意思是继承的深度吗?它怎么不是有限的呢?因为我不知道所有继承的类,所以我不能将它们放在visitor中。为了让这有意义,您需要visitor(派生类或基类)对所有类都一视同仁。如果它需要“知道”该类是
a
还是
B
类,那么使用虚拟访问者将不起作用。
struct ABaseVisitor {
  virtual void visit(Base &) = 0; /* huh? */
};