У меня есть иерархия классов (Base
и дочери 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
абстрактный класс для того, чтобы наследовать новых посетителей. Проблема возникает, когда я хочу определить абстрактный класс:
struct ABaseVisitor {
virtual void visit(Base &) = 0; /* huh? */
};
Есть ли у вас какие-либо идеи?
Задача ещё не решена.
Других решений пока нет …