Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
February 13, 2011 Double-dispatch | ||||
---|---|---|---|---|
| ||||
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 Re: Double-dispatch | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sean Eskapp | 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 Re: Double-dispatch | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sean Eskapp | 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 Re: Double-dispatch | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sean Eskapp | 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 Re: Double-dispatch | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | == 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 Re: Double-dispatch | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sean Eskapp | 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.
|
Copyright © 1999-2021 by the D Language Foundation