Thread overview
Double-dispatch
Feb 13, 2011
Sean Eskapp
Feb 13, 2011
Simen kjaeraas
Feb 13, 2011
Lutger Blijdestijn
Feb 13, 2011
bearophile
Feb 13, 2011
Sean Eskapp
Feb 17, 2011
Peter Alexander
February 13, 2011
I remember in C++, I had to do double-dispatch using the visitor pattern. This is cumbersome, just because each subclass has to have the exact same singly-dispatched code that looks like:

void dispatch(Base& other)
{
   other.dispatch(*this);
}

Is there a nicer way to do this in D, or am I stuck with the same thing?
February 13, 2011
Sean Eskapp <eatingstaples@gmail.com> wrote:

> I remember in C++, I had to do double-dispatch using the visitor pattern. This
> is cumbersome, just because each subclass has to have the exact same
> singly-dispatched code that looks like:
>
> void dispatch(Base& other)
> {
>    other.dispatch(*this);
> }
>
> Is there a nicer way to do this in D, or am I stuck with the same thing?

Andrei Alexandrescu (yes, the same one) wrote a generic implementation of
multimethods[1] for his book Modern C++ Design[2]. You might want to take
a look at that. If you decide to re-implement it in D, it might also be
worth incorporating in Phobos.

[1]: http://loki-lib.cvs.sourceforge.net/loki-lib/loki/include/loki/MultiMethods.h?view=markup
[2]: http://www.amazon.com/a/dp/0201704315/

-- 
Simen
February 13, 2011
Sean Eskapp wrote:

> I remember in C++, I had to do double-dispatch using the visitor pattern. This is cumbersome, just because each subclass has to have the exact same singly-dispatched code that looks like:
> 
> void dispatch(Base& other)
> {
>    other.dispatch(*this);
> }
> 
> Is there a nicer way to do this in D, or am I stuck with the same thing?

There isn't really, but you can take out some of the boilerplate with a mixin, which goes a long way:

// The template parameter Visitor is not actually needed, depending on
// what you want to do
mixin template Accept(Visitor)
{
    void accept(Visitor v)
    {
        v.visit(this);
    }
}

class Stuff
{
    mixin Accept!IStuffVisitor;
}



With some ctfe it's also not too hard to take out the boilerplate of creating the visitor interface with a bit of code generation, though I'm not sure if it's worth it.
February 13, 2011
Sean Eskapp:

> Is there a nicer way to do this in D, or am I stuck with the same thing?

Andrei has recently said no one needs double dispatch (in D) :-) So Andrei will be interested in your use case.

Bye,
bearophile
February 13, 2011
== Quote from bearophile (bearophileHUGS@lycos.com)'s article
> Sean Eskapp:
> > Is there a nicer way to do this in D, or am I stuck with the same thing?
> Andrei has recently said no one needs double dispatch (in D) :-) So Andrei will
be interested in your use case.
> Bye,
> bearophile

The age-old collision handling problem is how I'm using it.
February 17, 2011
On 13/02/11 9:32 PM, Sean Eskapp wrote:
> == Quote from bearophile (bearophileHUGS@lycos.com)'s article
>> Sean Eskapp:
>>> Is there a nicer way to do this in D, or am I stuck with the same thing?
>> Andrei has recently said no one needs double dispatch (in D) :-) So Andrei will
> be interested in your use case.
>> Bye,
>> bearophile
>
> The age-old collision handling problem is how I'm using it.

Use a 2D array of function pointers, with the indices coming from unique IDs on the shapes.