Что не является избыточным, это тип *this
. В базовом классе тип *this
равен object
. В производном классе тип *this
равен derived
. Это различие и делает шаблон посетителей полезным.
Вы можете избежать переопределения функции во всех производных классах благодаря CRTP:
class base_acceptor{
public:
virtual void accept(visitor *v) {v->accept(*this);}
};
template<class Derived, class...Bases>
class acceptor_implementer
: public Bases...
{
void accept(visitor *v) override {
assert(dynamic_cast<Derived*>(this)!=nullptr);
v->accept(static_cast<Derived&>(*this));
}
};
class acceptor1
:acceptor_implementer<acceptor1,base_acceptor>
{};
class acceptor2
:acceptor_implementer<acceptor2,base_acceptor>
{};
class acceptor11
:acceptor_implementer<acceptor11,acceptor1>
{};