Re: Class hierarchy on visitor side of visitor pattern
allnor@tele.ntnu.no (Rune Allnor) wrote (abridged):
Below is a code snippet that sketches two class hierarchies,
on both sides of the visitor pattern.
[...]
So to make life as user easy (see the desired syntax as pointed
out in function main()), I want to have the double dispatch methods
return references.
This doesn't work, as the compiler isues an error in the indicated
function DerivedVisitor::visit(): "Cannot convert from BaseVisitor
to DerivedVistor &."
So I am a bit lost. I always thought one could 'generalize'
references and pointer on functon.
The core is essentually:
BaseVisitor& Base::dispatchType(BaseVisitor*);
DerivedVisitor& DerivedVisitor::visit(Base* b)
{
DerivedVisitor &result = b->dispatchType(this); // Type error.
return result;
};
Here dispatchType() returns a reference to BaseVisitor, and there is no
implicit conversion from base to derived, so I wouldn't expect this to
work. You can implicitly convert from derived to base but not from base
to derived because the latter wouldn't be safe.
I've added a variable to be clearer about where the error is: the
covariant return part is OK. I'm not sure what you mean by "generalize"
here: this is the same whether we have pointers or references.
Is it at all possible to obtain what I want while leaving the
Base/ derived_n visitee classes with knowledge only about the
BaseVisitor class?
As Vidar Hasfjord says, in this case you can simply have the visitor
return itself.
DerivedVisitor& DerivedVisitor::visit(Base* b)
{
b->dispatchType(this);
return *this;
};
This is arguably safer anyway, as the DerivedN classes can't make it go
wrong.
-- Dave Harris, Nottingham, UK.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]